我编写了一个简单的关于基本阴影映射技术的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;
尖叫声:
如你所见,自影消失了!但是如果我放大到遮挡器和阴影之间的极限,我们就可以看到一个没有阴影的区域。这个神器叫做彼得潘宁神器。
因此,这是一个奇怪的情况:为了避免自影伪像,我需要修改光空间中的顶点深度值。但是,这种深度值的修改会导致彼得潘宁神器!
如果我增加偏移值,问题就更严重了。
更新
我还试着添加一个偏移量。例如:
tmp_shadow_coords.z += 0.0002f;
截图:
有较少的自我遮蔽,但没有彼得潘宁神器。但不幸的是,它在立方体的正面出现了一些文物。正面的阴影溢出了。
如果我增加抵消额:
tmp_shadow_coords.z += 0.0003f;
截图:
自影伪像已经完全消失,但前面的阴影溢出更严重。
因此,我想知道是否有可能有一个渲染同时没有自我跟踪的神器和没有彼得潘宁神器?
发布于 2014-10-17 13:33:31
这个效果很好。铸件表面与接收面非常接近的地方有一个很小的间隙。
在阴影中,最重要的是如何应用阴影。按阴影/遮挡值来标度增加的直接光、漫射和镜面项(环境项应单独使用)。一个简单的检查是,在阴影的表面应该完全相同的表面,面对远离光线,阴影禁用。阴影不应该仅仅使事物变得更暗(即finalColour *= 1.0-shadowScale
或finalColour -= shadow
),相反,它们是没有直接光的。当涉及多个灯时,这变得非常重要。
https://stackoverflow.com/questions/26401223
复制相似问题