我已经编写了一个有关基本阴影映射技术的简单OpenGL测试应用程序。
除了在封堵器背面上的工件外,我已去除了大部分工件。该背面受到伪影的影响,因为在第一次渲染过程(阴影深度图填充)期间,我启用了正面剔除。因此,我有自遮蔽的Z值伪影。
为了解决这种问题,它在一些教程中说过,光空间中顶点位置的深度需要以非常小的偏移量(例如0.0005f)进行偏移。
这是我的问题的屏幕截图(为了能见度,我增加了盒子的环境光值)。这里没有深度偏移:
如您所见,它具有很强的自我遮蔽性。
这是我在片段着色器中使用的一段代码:
if (ShadowCoords.w > 0.0f)
{
vec4 tmp_shadow_coords = ShadowCoords;
tmp_shadow_coords.z -= 0.0000f; //DEPTH OFFSET DISABLE HERE
shadowFactor = textureProj(ShadowMap, tmp_shadow_coords);
}
现在,让我们看看使用等于0.0002f的偏移量会发生什么:
tmp_shadow_coords.z -= 0.0002f;
屏幕截图:
如您所见,自我阴影减少了。现在让我们尝试使用等于0.0003f的偏移量:
tmp_shadow_coords.z -= 0.0003f;
截图:
如您所见,自我阴影消失了!但是,如果我朝着遮挡物和阴影之间的极限放大,我们可以看到没有阴影的区域。该工件称为Peter Panning工件。
因此,这是一个奇怪的情况:为避免自阴影伪像,我需要修改光照空间中的顶点深度值。但是,对深度值序列的这种修改会导致Peter Panning伪像!
如果我增加偏移值,问题就更糟了。
更新
我也尝试添加偏移量。例如:
tmp_shadow_coords.z += 0.0002f;
截屏:
There's less self-shadowing but no Peter Panning artifact. But unfortunatly it appears some artifacts on the front faces of the cube. There's an overflow of the shadow on the front faces.
If I increase the offset:
tmp_shadow_coords.z += 0.0003f;
Screenshot:
The self-shadowing artifacts have completely disappeared but the shadow overflow in front faces is worse.
So I wonder if it's possible to have a render without both self-shadowing artifact and no Peter Panning artifact ?
This works pretty well. There is a small gap where the casting surface is very close to the receiving surface.
在着色器中正确使用的主要方法是如何应用阴影。仅按阴影/遮挡值缩放添加的直接光线,漫反射和镜面反射项(环境项应单独放置)。一个简单的检查是,阴影中的表面应看起来与禁用了阴影的背向灯光的表面完全相同。阴影不应该只是使事物变暗(即finalColour *= 1.0-shadowScale
或finalColour -= shadow
),而应该是没有直射光。当涉及多个灯时,这变得非常重要。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句