由于我使用的纹理颜色深沉(这些伪影不可见),我以前从未见过的硬阴影有一种奇怪的行为。这是我使用 3 种不同阴影贴图分辨率的问题的一些屏幕截图:
1) 阴影贴图 160 * 120
如您所见,立方体表面有一种牙齿。
这是从灯光位置看的场景:
这是阴影贴图:
2) 阴影贴图 640 * 480
分辨率越高,伪影就越不明显,因为阴影贴图带来了更高的精度。
这是从灯光位置看的场景:
这是阴影贴图:
我尝试了更高的其他分辨率。当然,伪影越来越小,但如果你放大表面,它们仍然可见。
这是我在第二次传递期间在片段着色器中使用的代码:
[...]
uniform sampler2DShadow ShadowSampler[MAX_LIGHT_COUNT];
[...]
float GetDynamicShadowBias(vec3 normalDir_cs, vec3 lightDir_cs)
{
float cosTheta = clamp(dot(normalDir_cs, lightDir_cs), 0.0f, 1.0f);
float bias = 0.005f * tan(acos(cosTheta));
return (clamp(bias, 0.0f, 0.01f));
}
float GetBiased_Hard_ShadowFactor(vec3 normalDir, vec3 lightDir, int idx)
{
if (ShadowCoords[idx].w > 0.0f)
{
float bias = GetDynamicShadowBias(normalDir, lightDir);
float LightToOccluderClipDist = texture(
ShadowSampler[idx], ShadowCoords[idx].xyz/ShadowCoords[idx].w);
float LightToVertexClipDist = (ShadowCoords[idx].z - bias)/ShadowCoords[idx].w;
if (LightToOccluderClipDist < LightToVertexClipDist)
return (0.0f);
}
return (1.0f);
}
所以我想知道是否有可能去除立方体边缘的这些伪影。我试图在没有真正成功的情况下使用阴影偏差(有关信息,我在第一遍(填充深度纹理)期间使用 FRONT_FACE 剔除)。