Я пытаюсь добиться эффекта прожектора с помощью Cg.
Я уже успел сделать нормальное рассеянное освещение.
Я понимаю основные функциональные возможности прожектора (положение, направление, угол среза), но работа с ними в Cg все еще ускользает от меня.
Вот как я вычисляю параметры прожектора:
float4 dir_aux = mul(ModelViewProj, direction);
float4 lightP_aux = mul(ModelViewProj, lightPosition);
float3 lightP = lightP_aux.xyz;
float3 dir = normalize(dir_aux.xyz);
float3 P = IN.position;
float3 V = normalize(lightP - P);
dir = normalize(lightPosition - dir);
float angle = dot(V, dir);
направление - это пиксель, на который указывает прожектор (например: (0, 0, 0))
lightPosition - это положение света
P - это точка, которую я пытаюсь осветить. IN.position происходит из вершинного шейдера, и он уже умножен на modelViewProj.
angle - косинус угла между направлением света и направлением от света к точке, которую я пытаюсь осветить.
Проблема в том, что изменение направления света не влияет на прожектор. Оно всегда будет центрировано в 0,0,0.
Если я меняю lightPosition, прожектор меняется, но он все еще начинается с 0,0,0 и расширяется в противоположность положению света
Другое дело, что когда я вычисляю вектор направления, я использую lightPosition вместо lightP. Если я использую lightP, прожектор не будет работать вообще.
Также прожектор освещает только половину сцены.
Моим основным справочным материалом для этого была глава 5 (Освещение) из Учебник по Cg .