Читаю OpenGL Cookbook наткнулся на очень интересную модель освещения, основанную на кубических картах. Смысл вот в чем: каждый тексель окружающей текстуры считается маленьким источником освещения. Если сторона кубмапы равна N, то текселей в ней будет 6*N^2, поэтому рассчитывать все в реальном времени невозможно. Поэтому освещение рассчитывают заранее, и результат заносят в другую кубическую карту.
Например диффузное освещение от n источников, можно рассчитать по формуле:
где Kd - диффузный цвет поверхности, Si - положение источника света, n - нормаль к поверхности, Li - цвет источника света.
Однако заранее нормаль не известна, так как освещаемые объекты могут быть различны. Поэтому, для предрасчета освещения, используют дополнительную кубическую карту, которая играть роль функции, переводящей нормаль n в результирующее значение цвета поверхности. То есть для каждого направления нормали требуется рассчитать (по формуле выше) значение диффузной компоненты света.
Аналогично, можно заранее рассчитать значение зеркальной компоненты:
Здесь кубическая карта будет переводить позицию наблюдателя v в зеркальную составляющую освещения.
Вообще, существует программы, которые занимаются генерированием таких карт, например HDRShop и Modified CubemapGen. Однако первая стоит денег, вторая у меня не запустилась (да и обе под Windows). Поэтому я решил написать свой вариант.
Результат получился весьма приличным:
Например диффузное освещение от n источников, можно рассчитать по формуле:
где Kd - диффузный цвет поверхности, Si - положение источника света, n - нормаль к поверхности, Li - цвет источника света.
Однако заранее нормаль не известна, так как освещаемые объекты могут быть различны. Поэтому, для предрасчета освещения, используют дополнительную кубическую карту, которая играть роль функции, переводящей нормаль n в результирующее значение цвета поверхности. То есть для каждого направления нормали требуется рассчитать (по формуле выше) значение диффузной компоненты света.
Аналогично, можно заранее рассчитать значение зеркальной компоненты:
Здесь кубическая карта будет переводить позицию наблюдателя v в зеркальную составляющую освещения.
Вообще, существует программы, которые занимаются генерированием таких карт, например HDRShop и Modified CubemapGen. Однако первая стоит денег, вторая у меня не запустилась (да и обе под Windows). Поэтому я решил написать свой вариант.
Результат получился весьма приличным: