Листинг 9.5. Преобразование текстурных координат
gl_JexCoord[0] = gl_TextureMatnx[0] * g1_MultiTexCoordO:
9,2. Источники освещения
В OpenGL необходимо вычислять освещение. Начнем с определения функции для каждого типа источников освещения: направленного света, точечных и прожекторов. Для этого существуют переменные, в которых будут содержаться доли рассеянного, отраженного и зеркального света от всех источников освещения. Эти переменные должны быть инициализированы в 0 перед вычислением освещения.
9.2.1. Источники направленного света
Направленный свет - это свет, источник которого находится бесконечно далеко от освещаемых объектов. С таким допущением все лучи света от источника параллельны, и для каждой точки можно использовать один и тот же вектор направления освещения. Это упрощает математические вычисления, поэтому код для работы с направленным освещением проще, чем код для работы с другими видами освещения, и быстрее работает. Так как источник света бесконечно далек, направление максимального освещения одинаково для каждой точки. Этот вектор можно вычислить для каждого источника света i заранее и сохранить в переменной gl_li ghtSource[i ]. hal fVector. Этот тип источника освещения используется для имитации солнечного света.
Функция вычисления направленного света (листинг 9.6) определяет косинус угла между нормалью поверхности и направлением освещения, а также косинус угла между нормалью поверхности и половиной угла между направлением освещения и направлением обзора. Предыдущее значение умножается на цвет рассеянного освещения, чтобы вычислить рассеянную часть освещения. Последующее значение возводится в степень из gl_FrontMaterial .shininess, а затем умножается на цвет отраженного освещения.
Отраженное или зеркальное освещение присутствует, только если угол между направлением освещения и нормалью поверхности находится в диапазоне [-90°, 90°]. Это можно определить проверкой значения nDotVP. Это значение устанавливается в максимальное значение из 0 и косинуса угла между направлением света и нормалью поверхности. Если это значение - 0, значение зеркального отражения также устанавливается в 0. Приведенная здесь функция направленного освещения предполагает, что все векторы нормализованы, так что операция dot над двумя векторами дает косинус угла между ними.
Листинг 9.6. Вычисления освещения от направленного источника
void DirectionalLight Г in int i.
in vec3 normal.
inout vec4 ambient, .
npooojoiceitue & Листинг 9.6 {продолжение)
inout vec4 diffuse, inout vec4 specular)
{
float nDotVP; // нормаль . направление освещения
float nDotHV; // нормаль . половинный вектор
float pf; // степень
nDotVP = max(0.0. dot(norrnal, vec3 (gl_LightSource[i].position))); nDotHV = max(0,0, dot{norma 1, vec3 (gl_LightSourceCi].halfVector)));
if (nDotVP == 0.0) pf = 0.0:
else
pf = pow(nDotHV, gl_FrontMaterial.shininess);