【问题标题】:shadow maps, woo trick, depth peeling阴影贴图,woo 技巧,深度剥离
【发布时间】:2013-07-08 17:24:01
【问题描述】:

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

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

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

但接着就出现了暗影粉刺的问题。所以,第二步是这样的:

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

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

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

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

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

3- 存储为您的最终深度图(第一个深度图 + 第二个深度图)/2

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

现在问题出现在第2步,和我们之前的相同问题:当第一层和第二层接近时,会出现舍入误差,还会出现某种粉刺,也没有合适的偏差值。 所以,我没有从 woo 算法中得到任何好处,它只是将问题转移到深度剥离部分。

你怎么解决这个问题?

【问题讨论】:

  • 我从来没有听说过 woo 把戏这个词。约翰·卡马克(John Carmack)多年前提出了一个类似的技巧,使用正面,然后是背面渲染,而不是深度剥离。

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


【解决方案1】:

我没有从 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多