Про Image-based Lighting

Читаю OpenGL Cookbook наткнулся на очень интересную модель освещения, основанную на кубических картах. Смысл вот в чем: каждый тексель окружающей текстуры считается маленьким источником освещения. Если сторона кубмапы равна N, то текселей в ней будет 6*N^2, поэтому рассчитывать все в реальном времени невозможно. Поэтому освещение рассчитывают заранее, и результат заносят в другую кубическую карту.
Например диффузное освещение от n источников, можно рассчитать по формуле:
где Kd - диффузный цвет поверхности, Si  - положение источника света, n   - нормаль к поверхности, Li - цвет источника света.

Однако заранее нормаль не известна, так как освещаемые объекты могут быть различны. Поэтому, для предрасчета освещения, используют дополнительную кубическую карту, которая играть роль функции, переводящей нормаль n в результирующее значение цвета поверхности. То есть для каждого направления нормали требуется рассчитать (по формуле выше) значение диффузной компоненты света.
Аналогично, можно заранее рассчитать значение зеркальной компоненты:
Здесь кубическая карта будет переводить позицию наблюдателя v в зеркальную составляющую освещения.
 
Вообще, существует программы, которые занимаются генерированием таких карт, например HDRShop и Modified CubemapGen. Однако первая стоит денег, вторая у меня не запустилась (да и обе под Windows). Поэтому я решил написать свой вариант.

Результат получился весьма приличным:


     

Leave a Reply

Технологии Blogger.