Начало и окончание функции прожектора (листинг 9.8) выглядят точно так же, как функция точечного освещения (см. листинг 9.7). Различия - в середине функции. Вычисляется скалярное произведение центрального направления

Традиционные шейдеры

прожектора (gl_L1ghtSource[i].spotDirection) и вектора от источника освещения до поверхности (-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 ambient. inout vec4 diffuse, inout vec4 specular)
{

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

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

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

float spotDot: II косинус угла раскрытия конуса

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

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

// освещения

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

// освещения

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

// Вычисление вектора от поверхности до источника освещения VP = vec3 Cgl_LlghtSource[i].position) - ecPQSition3:

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

// Нормализация вектора от поверхности до источника освещения VP = normalize(VP):

// Вычисление коэффициента поглощения

attenuation - 1.0 / (gl_LightSource[i].constantAttenuatidn + gl_LightSource[i].1inearAttenuation * d + gl_LightSource[i].quadraticAttenuation * d * d):

⇐ Предыдущая| |Следующая ⇒