我的影子是正确的,但被剪掉了
My shadow is correct but cut
我目前正在为我的 game engine 实现阴影贴图,它似乎可以很好地渲染和投射阴影贴图,但如果阴影距离发射器太近,它似乎会被剪切,如屏幕截图所示:
(白线用于检查阴影是否在正确的位置,它们从聚光灯的原点投射到立方体的顶点)。
如您所见,阴影被剪切了,因为它应该从立方体在地板上的边缘开始。
我使用的是 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);
片段着色器:
#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
这是我制作的一个视频来展示这个错误,聚光灯从一个立方体投下阴影(两个都没有移动),我让地板下降的地方,阴影似乎会在距离结束后自行修复足够棒了:
我是不是漏掉了什么?
我解决了我的问题,这是由偏差引起的(它应该在透视分割之前应用,而不是之后)。
我目前正在为我的 game engine 实现阴影贴图,它似乎可以很好地渲染和投射阴影贴图,但如果阴影距离发射器太近,它似乎会被剪切,如屏幕截图所示:
(白线用于检查阴影是否在正确的位置,它们从聚光灯的原点投射到立方体的顶点)。
如您所见,阴影被剪切了,因为它应该从立方体在地板上的边缘开始。
我使用的是 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);
片段着色器:
#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
这是我制作的一个视频来展示这个错误,聚光灯从一个立方体投下阴影(两个都没有移动),我让地板下降的地方,阴影似乎会在距离结束后自行修复足够棒了:
我是不是漏掉了什么?
我解决了我的问题,这是由偏差引起的(它应该在透视分割之前应用,而不是之后)。