halfVector = normalize(VP + eye);

nQotVP = maxCO.O. dot(normal. VP)); nDotHV = maxCO.O. dot(normal, halfVector));

if (nDotVP == 0..0)

pf = 0.0; else

pf = pow(nDotHV, gl JrontMaterial .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 изменяет их таким образом, чтобы в некоторых направлениях этого излучения не происходило, и получается конус света.

Начало и окончание функции прожектора (листинг 9.8) выглядят точно так же, как функция точечного освещения (см. листинг 9.7). Различия - в середине функции. Вычисляется скалярное произведение центрального направления прожектора (gl_L1ghtSource[i].spotDi recti on) и вектора от источника освещения до поверхности (-VP). Полученное значение косинуса сравнивается с предварительно вычисленным значением косинуса граничного значения (gl_Light-Source[i ]. spotCosCutoff), чтобы определить, где находится данная точка поверхности - внутри конуса света или снаружи. Если точка находится снаружи, коэффициент поглощения равен 0; в противном случае это значение возводится в степень gl_lightSource[i ] .spotExponent. Этот коэффициент поглощения умножается на тот, что был вычислен предварительно, чтобы получить общий коэффициент. Остальные строки кода не отличаются от кода функции для точечного источника освещения.

Листинг 9.8. Вычисление освещения от прожектора

void SpotLight( in int i, in vec3 eye. in vec3 ecPosition3. in vec3 normal. inout vec4 arabient, inout vec4 diffuse, inout vec4 specular!

{

float nDotVP: // нормаль . направление освещения

float nDotHV: // нормаль . половинный вектор освещения

float pf: // степень

float spotDot; // косинус угла раскрытия конуса

float spotAttenuation: it коэффициент поглощения

float attenuation; // вычисленный коэффициент поглощения

float d: // расстояние от поверхности до. источника

// освещения

vec3 VP: // направление от поверхности до источника

// освещения

vec3 halfVector: // направление максимума освещения

// Вычисление вектора от поверхности до источника освещения

VP = vec3 Cgl_LightSource[i].position) - ecPosition3:

// Вычисление расстояния меиду поверхностью и источником освещения d = length(VP):


⇐ вернуться назад | | далее ⇒