June 25th, 2005

anton

Ray Tracing #4


Первый блин прошел комом.

Сегодня реализовал брутфорсовое интегрирование первичного освещения. Естественно Монте-Карло. Естественно area lights. Тени стали значительно реалистичнее и красивее.

Естественно появилась куча новых проблем. Основная - скорость. Ясно, что чудес не бывает, но все таки хочется быстрее. Картинка размером 2048x1536 с тремя сферическими источниками света и зеркальными шариками, что круто увеличивает глубину трассировки, рендерилась около часа. Думаю, что нужно прикручивать какую-нибудь адаптивность. Еще можно попробовать считать честно только для видозависимой компоненты (спекуляра) и только в нужных местах, а для диффузной воспользоваться какой-нибудь аппроксимацией, например Radiosity. Ambient Occlusion не катит, т.к. в принципе работает только для фонового (environmental) света, а для локальных источников работает некорректно.

Может быть гуру подскажут как работает пиксаровская реализация? Как я понимаю многое можно ускорить через шейдеры если воспользоваться фейками (shadowmaps и т.п.). Интересно как у пиксара работает реализация шейдерных инструкций illuminance, illuminate и т.п., которые отвечают за интегрирование.

Меня, лично, пиксаровский подход немного расстроил (возможно я чего-то не вижу) и вот почему. По идее, шейдеры света должны описывать интенсивность конкретной лампочки, а вместо этого они описывают плотность потока освещения (flux density), т.к. в каждом шейдере обязательно происходит деление на L.L, т.е. квадрат расстояния. Это намекает на то, что интегрировать нужно по поверхности источника света, а хочется по телесному углу, т.к. с углом все понятно, а с площадью не очен. Ну-ка, кто может посчитать площадь полигонального меша???

Посмотрел в максе. Area shadows считаются нереально быстро. С одной стороны обидно, что пока не знаю как они такого достигли, а с другой не так обидно, значит есть к чему стремиться :)

Еще возник вопрос, который нужно разведать: существует ли реализация рендера, которая честно делает displacement??? Т.е. не просто пертурбируя нормали, но реально модифицируя геометрию. С помощью современных GPU можно для этого воспользоваться таким фейком, как parallax mapping или его аналогом, но что-то мне подсказывает, что такие алгоритмы не прокатят, т.к. displacement задается не текстурой, а шейдером в общем случае, который может быть сколь угодно коварным. Не верится, что есть рендер, который сможет нарисовать колючий шарик (колючки создаются шейдером дисплейсмента) и при этом рассчитать тени :) Ну если только не генерить ultra-high-poly сетку.

Дальше: чищу код, срочно думаю об оптимизациях в интегрировании и, конечно же, прикручиваю вторичное освещение. Аллилуйя!