// Проверка вхождения точки поверхности в конус света spotDot = dot (-VP. gl_LightSource[i].spotDire.ction):
if (spotDot < gl_LightSource[i].spotCosCutoff)
spotAttenuation = 0.0: // этот источник освещения не участвует else
spotAttenuation =* pow(spotDot. gl_LightSource[i ] .spotExponent): // Совмещение коэффициентов поглощения и расстояния
93. Свойства материала и освещение
attenuation *= spotAttenuation; halfVector = normalize(VP + eye): nDotVP = max(0.0. dot(normal. VP)); nDotHV = max(0.0. dotCnormal. halfVector));
if CnDotVP = 0.0)
pf = 0.0: else
pf = pow(nDotHV. gl_FrontMaterial.shininess): ambient += g1_LightSource[i].ambient:
diffuse += gl_LightSource[i] .diffuse * nDotVP * attenuation: specular += gl_LightSource[i].specular * pf * attenuation:
1.3. Свойства материала и освещение Вычисление освещения в OpenGL требует знания направления обзора в системе координат обзора, чтобы вычислить элемент отражения. По умолчанию направление обзора принимается параллельным оси -г. В OpenGL есть режим, требующий определения направления обзора от начала координат в системе координат обзора. Чтобы сделать это, можно преобразовать входные координаты вершины в систему координат обзора с помощью текущей матрицы модели-вида. Координаты х,уигточки обзора делятся на однородную координату w для получения значения vec3, которое и используется в дальнейших вычислениях. Вычисление этих координат обзора (ecPosi tion3) показано в разделе 9.1. Для получения единичного вектора направления обзора нужно нормализовать и инвертировать координаты. Код шейдера, который это выполняет, показан в листинге 9.9.
Листинг 9.9. Вычисление координат наблюдателя
if (LocalViewer)
eye = -normalize(ecPosition3): else
eye - vec3 (0.0. 0.0. 1.0); После этого можно инициализировать переменные, которые затем будут использоваться для накопления составляющих рассеянного света, отражения и зеркального отражения от всех источников освещения. Можно использовать функции из предыдущего раздела, чтобы вычислить вклад в освещение каждого источника. В коде листинга 9.10 предполагается, что все источники освещения с номером, меньшим NumEnableclLights, включены. Источники направленного освещения имеют значение однородной координаты w равное 0 во время передачи этих координат в OpenGL (затем все переданные координаты преобразуются с помощью матрицы модели-вида, так что координата w после преобразования останется О, если последний столбец матрицы типичный (ООО 1)). У точечных источников освещения угол ограничения равен 180°.