我的影子是正确的,但削减

时间:2015-06-27 20:43:01

标签: c++ opengl 3d shadow-mapping

我目前正在为我的game engine进行阴影贴图实现,它似乎正在渲染并投射阴影贴图但是如果阴影距离发射器太近,它似乎被剪切了,如此截图所示: Screenshot
(白线是为了检查阴影是否在正确的位置,它们是从聚光灯原点投射到立方体的顶点)。

正如您所看到的,阴影被切割,因为它应该从地板上的立方体边缘开始。

我使用从光源角度渲染的256 * 256深度16阴影贴图,带有透视矩阵:NzMatrix4f::Perspective(lightComponent.GetOuterAngle()*2.f, 1.f, 2.f, lightComponent.GetRadius())

最终为我们提供了以下投影矩阵:

1, 0, 0, 0,
0, 1, 0, 0,
0, 0, -1.02041, -1,
0, 0, -2.04082, 0

我发现减少zFar值有点改善阴影:

zNear = 0.1, zFar = 1000
zNear = 0.1, zFar = 500

我认为问题来自测试,虽然我不知道我做错了什么。

这里是着色器代码(投射阴影时):

顶点着色器:

vLightSpacePos = LightProjMatrix * LightViewMatrix * WorldMatrix * vec4(VertexPosition, 1.0);

Fragment Shader:

#if SHADOW_MAPPING
if (vLightSpacePos.w > 0.0)
{
    vec3 ProjectionCoords = vLightSpacePos.xyz / vLightSpacePos.w;

    vec2 UVCoords;
    UVCoords.x = 0.5 * ProjectionCoords.x + 0.5;
    UVCoords.y = 0.5 * ProjectionCoords.y + 0.5;

    float Depth = texture(ShadowMap, UVCoords).x;
    if (Depth < ProjectionCoords.z)
    {
        lightDiffuse *= 0.5;
        lightSpecular = vec3(0.0);
    }
}
#endif

这里是我制作的一个视频来展示这个错误,一个聚光灯从一个立方体投下一个阴影(两个都没有移动),而我在那里让地板下降,阴影似乎自我修复一旦距离足够大:

https://youtu.be/sisbOOml_cg

我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

我解决了我的问题,它是由偏见引起的(它应该在透视分割之前应用,而不是之后)。