glBi ndAttri bLocati onARBCprogramObj. 3. "Tangent"): glBindAttribLocationARBCprogramObj. 4. "Binomial"): Если и переменная tangent, и переменная bi normal определены как массивы из трех чисел с плавающей запятой, эти атрибуты можно передавать такими функциями:
glVertexAttrib3fvARBC3. tangent): glVertexAttrib3fvARB(4. bi normal1): или использовать произвольные массивы вершин.
Перед рендерингом приложение должно установить семь текстурных карт: три двухмерные текстурные карты будут хранить коэффициенты А, В и С для красного, зеленого и синего компонентов РТМ, еще три - коэффициенты D, Е и F для красного, зеленого и синего компонентов РТМ, а одномерная текстура будет хранить функцию освещения.
Эта последняя текстура устанавливается приложением всякий раз, когда состояние освещения меняется. Текстура коэффициента освещения решает четыре проблемы.
1. Распознавание передней и задней поверхностей. Эта текстура индексируется LdotN, значение положительное для вершин лицевой поверхности и отрицательное для вершин обратной поверхности. На первом уровне сложности текстура коэффициента освещения может решить проблему лицевой/обратной поверхности хранением значения 1,0 для лицевой и 0,0 - для обратной поверхности.
2. Иногда желательно освещать объекты цветным светом. На втором уровне сложности текстура освещения (в которой есть три канала, R, G и В) будет хранить цвет освещения вместо значения 1,0 для лицевой поверхности.
3. Резкий переход с лицевой поверхности на обратную выглядит некрасиво и не очень реалистично. На третьем уровне сложности применяется постепенное изменение значений текстуры от 0 до 1,0. Чтобы определить нужные значения, можно использовать кривую синуса или косинуса.
4. Для рендеринга с помощью РТМ не существует понятия общего освещения. Если выполнить рендеринг обратной поверхности со значениями (0, 0, 0), она может выглядеть очень нереалистично. Вместо того чтобы использовать значения 0 для отрицательных индексов, лучше подставлять значения 0,1.
10.5.2. Вершинный шейдер
Вершинный шейдер по методу BRDF РТМ приведен в листинге 10.7. Цель этого шейдера - вычислить значения пяти varying-переменных:
□ gl _Posi ti on - требуется от каждого вершинного шейдера;
□ TexCoord - будут использованы для обращения к текстуре, чтобы получить два набора коэффициентов полинома;
:.Q Du - косинус угла между направлением освещения и тангенциальным вектором (число с плавающей запятой);
□ Ov, - косинус угла между направлением освещения и вектором бинормали (число с плавающей запятой);
(□ LdotN - косинус угла между нормалью поверхности и направлением освещения (число с плавающей запятой).
Предполагается, что наблюдатель бесконечно удален, а источник освещения точечный и единственный.
Листинг 10.7. Вершинный шейдер для рендеринга с помощью полиномных текстур
//
// Вершинный шейдер РТМ от Брэда Риттера. Hewlett-Packard.
// и Рэнди Роста. 3D1abs.