【发布时间】: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