我正在尝试使用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章(照明),来自The Cg Tutorial。
答案 0 :(得分:3)
这是我对此的看法,我认为你的向量指向错误的方向(当你进行减法时):
// 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);
有点晚了,但我希望有帮助:)