我正在尝试制作一个自阴影对象(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算法中获益,它只是将问题转移到深度剥离部分。
你怎么解决这个问题?
答案 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_MAP
和DISTANCE_OF_THE_POINT_TO_LIGHT
使用它们或从不使用它们。
使用32位浮点纹理来存储深度。
尝试接近过滤器PCF的百分比。
深度剥离为您提供自适应BIAS。您还可以使用自适应分辨率:Cascaded Shadow Maps。