Оптимизация, которую здесь можно выполнить, состоит в том, чтобы получить две функции для вычисления точечного освещения: одна функция учитывает коэффициент поглощения, а другая - нет. Если значения постоянного, линейного и квадратичного коэффициентов - (1, 0, 0) (значения по умолчанию), для улучшения производительности можно использовать функцию без вычисления поглощения.
Листинг 9.7. Вычисления освещения от точечного источника
void PointLightdn int i.
in vec3 eye.
9.2.2. Точечные источники
9.2. Источники освещения
in vec3 ecPosition3, in гесЗ normal. inout vec4 ambient, inout vec4 diffuse, inout vec4 specular)
(
float nDotVP: // нормаль . направление освещения
float nDotHV; // нормаль . половинный вектор
float pf; // степень
float attenuation; // вычисленный коэффициент поглощения float d: // расстояние от поверхности до источника уесЗ VP: // направление от поверхности до источника
vec3 halfVector; // направпение максимального освещения
// Вычисление вектора от поверхности до источника VP - vec3 (gl_LightSource[i].position) - ecPosition3;
// Вычисление расстояния между поверхностью и источником d = lengtnCVP):
// Нормализация вектора от поверхности до источника VP = normalize(VP):
// Вычисление поглощения
attenuation = 1.0/( gl_LightSource[i].constantAttenuation + gl_LightSource[i].linearAttenuation * d + gl_L1ghtSource[iï.quadraticAttenuation * d * d);
halfVector = normalizeCVP + eye):
nQotVP = maxCO.O. dot(normal. VP)): nDotHV = max(0.0. dot(normal. halfVector)):
if (nDotVP - U..0)
pf = 0.0: else
pf = pow(nDotHV. gl JrontMatenal .shininess) : ambient += gl_LightSource[i].ambient:
diffuse += gl_LightSource[i].diffuse * nDotVP * attenuation: specular += gl_LightSource[i].specular * pf * attenuation;
}
9.2.3. Прожекторы
В театре и кино прожекторы обеспечивают мощный луч света, который освещает конкретный участок. Освещенный участок может ограничиваться заслонками, расположенными по сторонам источника освещения. В OpenGL существуют атрибуты освещения, которые используются для имитации простого типа прожектора. Так как обычно точечные источники освещения излучают свет во всех направлениях, OpenGL изменяет их таким образом, чтобы в некоторых направлениях этого излучения не происходило, и получается конус света.