Category: общество

Category was added automatically. Read all entries about "общество".

anton

RayTracing #3

Приходится совмещать работу с подготовкой к экзаменам и работой над трассировщиком. Мотивация крепчает с осознанием, что меня читают. Спасибо.

Последние три дня занят штудированием теоритических основ радиометрии. Меня совсем не устраивает подход "свет затухает обратно квадрату расстояния". Ясно, что за всеми процессами стоит реальная физика со своими законами и размерностями. Измарал огромную кучу бумаги пока расписывал формулы взаимного преобразования основных величин: плотности потока освещения (flux density), интенсивности освещения (illuminance intensity) и, главное, излучения (radiance).

Долго не понимал принципиальную разницу между светом рассяеным поверхностью и отраженным. Как показывает жизненный опыт, яркость диффузной поверхности (побеленого потолка) зависит от растояния до источника света, но вот изображение в зеркале не становится темнее, не смотря на росстояние до отражаемых объектов. Дело в том, что величина излучения [Вт/м^2*ср] не меняется c расстоянием, равно как и интенсивность света [Вт/ср], но плотность потока [Вт/м^2] уменьшается, как раз обратно квадрату расстояния. Оказалось, что секрет зарыт в BRDF для каждого случая. При диффузном рассеянии BRDF = const и под интегралом основного уравнения остается как раз величина плотности потока (sic!) для дифференциальной площади поверхности, а в случае зеркального отражения BRDF компинсирует уменьшение плотности потока просто перенаправляя вектор излучения.

В результате подобных ментальных и бумажных мыслеобразований стало понятно если не все, то очень многое. А главное что же есть цвет и интенсивность лампочки сцены. Я уверен, что большинство людей, которые создают в том или ином редакторе лампочку, присваивая ей цвет (rgb) и интенсивность (float) даже не задумываются о физическом значении этих величин и потом огребают массу проблем при экспорте сцен из одного редактора в другой, получая при этом радикальную разницу в освещении. Конечно в этом есть и вина разроботчиков, которые не дают дизайнеру информации о трактове параметров  внутри рендеров (у одних энергия света измеряется в ваттах, у других в люменах или еще чем). На самом деле правильно понимать, что цвет лампочки (наполняющий все вычисления зависимостью от спектра излучения) и интенсивность при покомпонентном перемножении есть ни что иное как 'излучение' (radiance) [Вт/м^2*ср]. Далее известная математика.

Были еще интересные открытия связанные с необходимостью интегрирования. При рассчете излучения от area lights, т.е. реальных объемных источников, мы считаем интеграл, либо по видимой поверхности источника света, либо по телесному углу заключающему в себя источник света, но как считать интеграл для идеальных точечных источников света у которых занимаемый объем и площадь бесконечно малы? Оказывается для описания идеальных источников нужно воспользоваться дельта-функцией, которая имеет смысл только под интегралом, который заведомо равен 1.

Что же с реализацией... К геометрии я добавил выпуклые полигоны, что позволит мне перейти к классическому Cornell Box для теста global illumination. А к интегрированию света прикрутил функцию видимости V(x,y), что сразу добавило реалистичности с помощью теней. Т.к. источники света идеальные, то и тени от них "жесткие" с четкими краями.

Картинка получилась такая:


Инлайновые вычисления дают свои плоды. В релизовом билде рендер работает очень быстро. До таймера руки не доходят, но сцена рассчитывается в 1024x768 и пишется файл за какие-нибудь три-четыре секунды на моем P4 2.4GHz. Хвастаться конечно нечем т.к. объектов в сцене очень мало, но думаю, рендер будет бодреньким и дальше. И уж точно я не собираюсь ждать расчета картинки 640x480 с пятью шариками и глубоким GI всю ночь как у одного коллеги с devmaster.net :)

Планы на ближайшее будущее: честное интегрирование первичного освещения и area lights.

 

anton

Ray Tracing #2

19 июня.

Сегодня экзамен по радиосистемам. Верю в себя и надеюсь на авось :(

Шейдеры поверхности реализовывают функцию двунаправленного переотражения, в народе известную как BRDF, т.е. на этом уровне все очень точно.

Собственно все основные вычисления делаются внутри шейдера поверхности, т.к. он отвечает за перенаправление входящего луча и интегрирование падающего потока излучения. Интегрирование осуществляется по заданному телесному углу, т.е. можно легко реализовать анизотропные материалы.

Пока интегрируется освещение первичных идеальных источников света.

Очевидно, что для рассчета global illumination нужно учитывать освещение от вторичных источников - объектов.

Radiosity отбрасываю сразу, потому что диффузно и видонезависимо, главное не попиксельно и добавляет кучу работы в сложных сценах, т.к. рассчитывается для всех(!!!) поверхностей. Мне же нужен фотореализмъ, а не риалтайм.

Хочу использовать численные методы для рассчета основного уравнения визуализации (Rendering Equation [Kajiya '86)]), в частности для основного интеграла.

Интегрирование потока излучения для рассчетной точки поверхности хочу осуществить трассировкой по конечному числу исходящих лучей. Обычно нас интересует освещение приходящее в точку поверхности через полусферу (телесный угол pi/2) ориентированную по нормали. Очевидно, мы получим заметное уменьшение разрешающей способности интегратора на большом расстоянии, т.е. фактически можем не заметить сильный источник света, который находится на относительно большом расстоянии от интересующей нас точки поверхности.

Вариантов решения несколько: можно адаптивно увеличивать количество лучей интегрирования, т.е. добавлять новые лучи при удалении от точки рассчета на определенное расстояние, обеспечивая равномерную сетку трассировки во всем пространстве, а можно отдельно интегрировать световые потоки от первичных и вторичных источников света. Основной плюс первого варианта - слепое следование основному закону визуализации, т.е. мы задаем точность и получаем соответствующее решение, унифицированно, по одному вполне ясному алгоритму без исключений - эдакий bruteforce в духе пиксаровских мейнфреймов (у них это называется rendering farm, я ясно представляю картину в духе тех полей по выращиванию энергии, как в матрице, только вместо коконов с людьми - тысячи слепых компов, соединенных толстенными сетевыми кабелями, которые отрешенно помаргивают светодиодами в пиксаровских вычислительных центрах, с потолками, исчезающими в холодной темноте). Основной плюс второго варианта - очевидно меньшее время для рассчета и интеллектуальность.

Если говорить про аппроксимацию решения (говорят аналитического решения для уравнения визуализации не существует, я не проверял), то, наверное, правильнее было бы пойти вторым путем, т.к. он заметно менее ресурсоемок и, наверняка, даст хорошие результаты в виду того, что вторичное освещение, как правило, существенно только на небольших расстояних, как раз там, где плотность лучей интегрирования достаточно высока. Но если мы рассчитываем место на которое падает "солнечный зайчик" от маленького зеркальца? Мы запросто можем это зеркальце и не заметить!!! На лицо проблема дискретизации, которая проявляется при рендеринге элементов с маленькими линейными размерами. Нужен метод определения источников пикового потока излучения?

В общем, нужно еще будет провести нехилый research по этой теме.
anton

Ray Tracing #1

17 июня.

Всю жизнь мечтал и наконец-то решился на правах хобби реализовать самый лучший в мире трассировщик лучей 8) конечно же будет все и global illumination, и motion blur, и sub surface scattering и шерсть. На подсознательном уровне маячит задача "сделать" Pixar (http://www.pixar.com). Бюджета нету (т.к. хобби) время неограниченно - все в моих руках.

Вчера накалякал основные библиотечные математические и не очень классы, чтобы потом ни о чем не думать: vector, matrix, quaternion, color. Все вычисления в числах с плавающей точкой в инлайне для скорости. Цвет тоже { float r, g, b }, чтобы можно потом с буффером кадра делать различные вкусности вроде exposure. Вообще, хочу в основу положить меньше аппроксимаций и больше реальной физики, чтобы все было честно, включая HDR.
Даешь фотореализмъ!!!

За основу взял архитектуру пиксаровского RenderMan. Т.е. все описывается шейдерами, включая источники света, поверхности, атмосферные (объемные) эффекты, displacement и наложение в буфер кадра. По идее все источники света должны быть area lights, но сразу это слишком круто, поэтому пока взял идеальные: точечный и направленный.

Реализовал стандартные шейдеры для материалов: константный, диффузный, метал, пластик. Т.е. прямо по пиксаровской спецификации, но в классах на С++. Пока ни каких парсеров.

Из геометрии реализовал только сферу, т.к. проще всего :)

Еще реализовал шейдер для Whitted рендеринга, т.е. учитывается амбиент, диффузный свет, спекуляр, а также прямое отражение и преломление. С преломлением пока не все гладко, а отражение работают как надо. Получил приятную для глаза и души картинку.

Неплохой результат для двух дней работы.

з.ы. экзамены побоку, первые успехи радует немеряно.