Прожектор OpenGL с Cg - PullRequest
       14

Прожектор OpenGL с Cg

2 голосов
/ 23 декабря 2010

Я пытаюсь добиться эффекта прожектора с помощью 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 .

1 Ответ

3 голосов
/ 01 февраля 2011

Вот мое мнение об этом, я думаю, ваши векторы указывают в неправильных направлениях (когда вы делаете вычитания):

// direction is actually the location of the target
float4 target = direction; // renamed for clarity   

float4 target_aux = mul(ModelViewProj, target);
float4 lightP_aux = mul(ModelViewProj, lightPosition);

float3 lightP = lightP_aux.xyz;
float3 targetXYZ = target.xyz;

// don't normalise this it's a location at this point, NOT a direction vector
//float3 dir = normalize(dir_aux.xyz);

float3 P = IN.position;
// reversed to give vector from light source to IN.Position
float3 V = normalize(P - lightP);

// reversed to give vector from light source to target
float3 dir = normalize(targetXYZ - lightP);

float angle = dot(V, dir);

Немного поздно, но я надеюсь, что это поможет:)

...