阴影贴图,宇技巧,深度剥皮

时间:2013-07-08 17:24:02

标签: 3d shadow shadow-mapping depth-testing

我正在尝试制作一个自阴影对象(opengl / glsl)。我做的步骤是:

1-从灯光渲染场景以获得深度图

2-从相机位置渲染并计算每个点到光源的距离,如果点到光的距离大于深度图中存储的深度,则该点在阴影中。

然后出现阴影痤疮的问题。所以,第二步将是:

2- ... if(abs(DISTANCE_OF_THE_POINT_TO_LIGHT - DEPTH_STORED_IN_THE_DEPTH_MAP)> BIAS)该点处于阴影中。

但它仍然没有给我很好的结果(没有合适的偏差值)。

所以,我实现了woo技巧(从光中找到第一个和第二个曲面,然后将中点存储在深度缓冲区中)。为此,我做了两次深度剥皮。步骤是:

1-像往常一样从灯光渲染场景以获得第一张深度图。

2-从光渲染场景以获得第二深度图,如果点到光的距离等于第一深度图中的距离,则丢弃这样的点(即,不渲染第一层)。

3-存储作为最终深度图(第1张深度图+第2张深度图)/ 2

4-从摄像机位置渲染并计算每个点到光源的距离,如果点到光的距离大于深度图中存储的深度,则该点处于阴影中。

问题现在出现在第2步,我们之前遇到的SAME问题:当第一层和第二层关闭时,会出现舍入错误,也会出现某种痤疮,并且也没有合适的偏差值。 所以,我没有从woo算法中获益,它只是将问题转移到深度剥离部分。

你怎么解决这个问题?

1 个答案:

答案 0 :(得分:0)

  

我没有从woo算法中获益,它只是移动了   深度剥离部分的问题。

在深度剥离和阴影映射中都存在Z-fighting问题,但阴影映射情况要差得多。

使用阴影贴图,您可以在相机空间中计算阴影贴图空间中的z值和样本位置(x,y。问题是,阴影贴图空间中通常没有样本(x,y),因此您将最接近的样本带到(x,y),然后将阴影深度与z值进行比较。

与阴影贴图不同,在深度剥离中,您要比较同一样本位置的z值(相同的阴影贴图空间)。它实际上是一个很好的解决方案来对抗阴影神器,如果你能负担得起但它在所有情况下都无济于事,例如:

如果屏幕上有一个大物体,那么就说一个房子。房子在阴影贴图上的投影可能位于少数甚至单个样本(一个像素)内,在这种情况下,为房子计算的所有z值将与相同的z值进行比较。阴影贴图。相反,屏幕上的一个像素可能对应于阴影贴图中的一个巨大区域。

建议改善结果:

确保DEPTH_STORED_IN_THE_DEPTH_MAP的计算方式与DISTANCE_OF_THE_POINT_TO_LIGHT完全相同。要特别注意隐藏的固定管道算法。对DEPTH_STORED_IN_THE_DEPTH_MAPDISTANCE_OF_THE_POINT_TO_LIGHT使用它们或从不使用它们。

使用32位浮点纹理来存储深度。

尝试接近过滤器PCF的百分比。

深度剥离为您提供自适应BIAS。您还可以使用自适应分辨率:Cascaded Shadow Maps