С развитием технологий и увеличением вычислительно мощности видеокарт все легче становиться использовать в трехмерной графике сложные вычислительные алгоритмы. Иногда, конечно, приходится немного пожертвовать производительностью ради красивого вида. Но что поделаешь — красота требует жертв, а сама красота в трехмерной графике достигается использованием «честных», то есть физически обоснованных алгоритмов. Одним из таких алгоритмов и является модель освещения Кука-Торренса. Она очень хорошо подходит для создания различных стеклянных и металлических поверхностей.
Так как эта модель используется для расчета отраженного света, то рассеянный свет мы будем вычислять по классической формуле Ламберта, в которой освещенность точки зависит только от угла между нормалью к поверхности в данной точки, и положением источника света. Вычисляется как скалярное произведение нормали и нормализованного положения источника света:
Теперь рассмотрим модель Кука-Торренса. Количество отраженного света зависит от трех факторов:
1. Коэффициент Френеля (F)
2. Геометрическая составляющая, учитывающая самозатенение (G)
3. Компонент, учитывающий шероховатость поверхности (D)
Общая формула для вычисления отраженного света такова:
где N – нормаль в точке, V – вектор взгляда, L – положение источника света, H – нормализованная сумма векторов L и V. Все векторы должны быть нормированы.
Компонент, учитывающий шероховатость поверхности – это распределение микрограней поверхности, для более точного учета отраженного от них света. Обычно, для вычисления этого компонента используют распределение Бекмана:
где параметр m (от 0 до 1) определяет шероховатость поверхности. Чем он больше, тем поверхность шероховатее, следовательно, отражает свет даже под широкими углами.
Коэффициент Френеля.
Для вычисления коэффициента Френеля существует много формул, но в данном случае целесообразнее применять аппроксимацию Шлика:
где F0 – количество отраженного света при нормальном падении (перпендикулярно поверхности). Для того чтобы не вводить дополнительный параметр, и не усложнять процесс вычислением степени, можно использовать другую формулу:
С поправкой на то, что металлы хорошо отражают – она дает так же неплохой результат.
Таким образом, мы вычислили все составляющие, и теперь можно подставить их в исходную формулу и получить ожидаемый результат.
2. Реализация модели Кука-Торренса на GLSL
Удобно будет написать функцию, которая будет нам вычислять отраженный свет по алгоритму Кука-Торренса. Наша функция должна иметь следующий вид:
мы передаем в неё нормированные вектора: нормаль, положение источника света, положение наблюдателя и параметр, определяющий шероховатость поверхности. Допустим, что если шероховатость равна нулю, то материал не отражает. Таким образом сразу можно написать:
Как я уже говорил, алгоритм Кука-Торренса хорошо подходит для металлов. Конечно вставив в свой шейдер эти формулы вы не получите металл :)
Для этого еще необходимо подобрать цвета и добавить отражения. И в итоге у вас может получиться вот такой золотой заяц: