Отраженное или зеркальное освещение присутствует, только если угол между направлением освещения и нормалью поверхности находится в диапазоне [-90°, 90°]. Это можно определить проверкой значения nDotVP. Это значение устанавливается в максимальное значение из 0 и косинуса угла между направлением света и нормалью поверхности. Если это значение - 0, значение зеркального отражения также устанавливается в 0. Приведенная здесь функция направленного освещения предполагает, что все векторы нормализованы, так что операция dot над двумя векторами дает косинус угла между ними.
Листинг 9.6. Вычисления освещения от направленного источника
void Di rectionalLight С in int i.
in vec3 normal.
inout vec4 ambient, л продолжение тЗ/
Традиционные шейдеры
Листинг 9,6 {продолжение)
inout vec4 diffuse, inout vec4 specular)
{
float nDotVP: // нормаль . направление освещения float nDotHV: // нормаль . половинный вектор float pf; // степень
nDotVP = maxCO.O. dottnormal. vec3 (gl_LightSource[l].position))): nDotHV = maxCO.O. dot(normal. vec3 (g1_LigntSource[i].halfVector))):
if (nDotVP -- 0.0) pf = 0.0:
else
pf = pow(nDotHV, gl_FrontMaterial.shininess):
ambient += gl_LightSource[i].ambient: diffuse += gl_LightSource[i].diffuse * nDotVP: specular += gl_LightSource[i].specular * pf:
}
Точечные источники освещения имитируют свет возле или внутри изображения, например лампы, люстры или уличные фонари. Существует два основных отличия точечных источников света от источников направленного освещения. Первое состоит в том, что направление максимальной подсветки должно быть вычислено в каждой вершине, а значение из gl_LightSource[i] .halfVector не может быть использовано. Второе отличие - в том, что свет, полученный поверхностью, уменьшается с удалением источника освещения. Этот эффект называется поглощением. Каждый источник освещения имеет постоянный, линейный и квадратичный коэффициенты, которые используются при вычислении доли освещения от точечного источника.
Эти различия выделяются уже в первых нескольких строках функции вычисления освещения от точечного источника (листинг 9.7). Первый шаг - вычисление вектора от поверхности до источника освещения с помощью функции длины. VP нормализуется и в дальнейшем будет использоваться в операции dot при па-хождении правильного значения косинуса. Коэффициент поглощения и направление максимума освещения вычисляются как обычно. Остальной код остается таким же, как и в предыдущей функции (вычисление света от источника направленного освещения), за исключением того, что отраженные и зеркальные составляющие освещения умножаются на коэффициент поглощения.