我正在尝试创建一个自阴影对象(opengl/glsl)。我所做的步骤如下:
1-从灯光渲染场景以获得深度贴图
2-从相机位置渲染并计算每个点到光源的距离,如果点到光的距离大于深度图中存储的深度,则该点处于阴影中。
但随之而来的是暗疮问题。因此,第二步如下所示:
2-偏置( abs(DISTANCE_OF_THE_POINT_TO_LIGHT - DEPTH_STORED_IN_THE_DEPTH_MAP) >...if)点在阴影中。
但是它仍然没有给我带来好的结果(没有合适的偏差值)。
因此,我实现了woo技巧(从光中找到第一个和第二个表面,然后将中点存储在深度缓冲区中)。为了做到这一点,我做了两次深度剥离。具体步骤如下:
1-像往常一样,从灯光渲染场景以获得第一个深度贴图。
2-从光渲染场景以获得第二个深度图,如果一个点到光的距离等于第一个深度图中的距离,则丢弃该点(即不渲染第一层)。
3-存储为最终的深度图(第一个深度图+第二个深度图)/2
4-从相机位置渲染并计算每个点到光源的距离,如果点到光的距离大于深度图中存储的深度,则该点处于阴影中。
问题现在出现在步骤2中,与我们之前遇到的问题相同:当第一层和第二层接近时,会出现舍入误差和某种类型的粉刺,并且也没有合适的偏置值。因此,我没有从woo算法中获得任何好处,它只是将问题转移到深度剥离部分。
你怎么解决这个问题呢?
发布于 2013-07-09 11:02:31
我没有从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位浮点纹理来存储深度。
尝试percentage closer filter PCF。
深度剥离为您提供了自适应偏差。您还可以使用自适应分辨率:Cascaded Shadow Maps。
https://stackoverflow.com/questions/17532523
复制相似问题