August 12th, 2006

Математика рулит

Итак, я использую в HLFX 0.6 попиксельное освещение. Для его расчета я взял вот такую формулу:



Вроде все правильно. Мы прибавляем к лайтмапе вклад диффузного бампа, сохраняем в текстуру, потом умножаем на неосвещенную сцену, и наконец прибавляем спекулярный бамп. Меня смущало вот что:
1. Требуется два прохода рендера (для лайтмапы и для неосвещенной сцены), и оба требуют привязки соответствующего шейдера (lightmap или unlit).
2. Приходилось два раза перебирать списки источников света. А это означает, что приходилось дважды рисовать теневые объемы и дважды выполнять ресурсоемкие операции по очистке стенсил-буфера.
3. Ну и копирование лайтмапы в текстуру - это означает остановку конвеера, что очень плохо.

На помощь пришло простейшее алгебраическое преобразование :) Только не говорите, что это очевидно - это мне теперь очевидно. А до этого я этого не осознавал. Формула теперь выглядит так:



Это добавило дополнительный проход для аттенуации (из-за ограничение на количество текстурных блоков), но она рисуется только в альфу и не сильно понижает fps. Зато все вышеперечисленные недостатки исчезли. FPS вырос в два раза :)
Потратил весь вечер на переписывание кода бампа (в который раз!), но оно того стоило %)