Spot Light似乎总是指向世界的中心

时间:2016-05-01 17:52:52

标签: xna shader monogame hlsl lighting

我目前面临的问题是,即使我仔细检查了我传递给着色器的方向向量,我的聚光灯似乎总是面向我的世界中心。

具有相同代码的点光源(但不限制基于其允许的角度和方向的光)工作正常。所以我的光矢量和一切似乎都有效。

这是此行为的图片:

enter image description here

在照片上,灯光朝向世界的中心,而不是无人机所面向的右侧。蓝点灯可以证明其他方式看起来也很有效。

我在视图空间中计算灯光并将以下内容传递给着色器:

SpotLightPositionViewSpace[spotLightNum] = Vector3.Transform(l.getPosition(), viewMatrix);
…
SpotLightDirectionViewSpace[spotLightNum] = Vector3.Normalize(Vector3.Transform(l.getLightDirection(), viewMatrix));
SpotLightAngleCos[spotLightNum] = (float)Math.Cos((double)(l.getLightAngleRad() / 2f));

在着色器中,如果光线方向和光线矢量之间的点积大于光线最大允许角度的余弦值,则不会点亮像素(一旦工作,它就会更顺畅地完成) :

lightDirection = normalize(SpotLightPositionViewSpace[j] - pin.PositionViewSpace.xyz);

if (intensityBasedOnDistance > 0.0 
&& (intensity = max(dot(surfaceNormal, lightDirection), 0.0)) > 0.0 
&& dot(-lightDirection, SpotLightDirectionViewSpace[j]) > SpotLightAngleCos[j])
{
diffuseColor += float4(SpotLightColor[j] * intensity * intensityBasedOnDistance * SpotLightIntensity[j], 0.0);
}

1 个答案:

答案 0 :(得分:0)

尝试数小时后改变

SpotLightDirectionViewSpace[spotLightNum] = Vector3.Normalize(Vector3.Transform(l.getLightDirection(), viewMatrix));

SpotLightDirectionViewSpace[spotLightNum] = Vector3.Normalize(Vector3.Transform(l.getForward(), viewMatrix.Rotation));

解决了......不知道为什么,但它现在有效。

如果有人能够解释这一点,我将非常感激。