June 22nd, 2005

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 рендеринга, т.е. учитывается амбиент, диффузный свет, спекуляр, а также прямое отражение и преломление. С преломлением пока не все гладко, а отражение работают как надо. Получил приятную для глаза и души картинку.

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

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

anton

Ray Tracing #2

19 июня.

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

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

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

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

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

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

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

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

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

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

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