我正在努力寻找在游戏引擎中使用的最佳阴影映射技术。到目前为止,我已经使用PCF实现了标准阴影贴图、级联阴影贴图和方差阴影贴图。然而,它们似乎都没有提供令人满意的结果。
我正试图找到适用于所有情况的最佳阴影映射方法。我要求背面具有正确的几何图形,因此可以使用渲染背面。然而,我也有一点低多边形,平滑的法线几何体,这会导致一些非常丑陋的粉刺,即使在绘制背面时也是如此。
还有哪些其他技术可以用来获得漂亮的阴影贴图,而不会出现严重的痤疮、平移或轻微出血,但也不会对几何体施加任何主要限制(仅背面)?
不幸的是,没有通用的方法可以产生无伪影的阴影,但我可以给你一些提示。
百分比接近过滤不仅是一个很好的起点,也是接触硬化阴影的基础(如果你感兴趣,我可以提供更多信息)。PCF基本上比方差阴影映射(VSM)或指数阴影映射(ESM)等统计算法产生更好的结果,但速度较慢,因为滤波步骤需要O(n²)而不是O(n)中的可分离滤波器。另一方面,轻度出血是一种疼痛,无法完全清除。
减少甚至去除阴影粉刺的最佳方法是双深度层阴影贴图,这是中点阴影贴图的改进。本文解释了这两种算法:
Weiskopf D.,Ertl T.(2003):"基于双深度层的阴影映射"
该技术需要为每个阴影贴图额外渲染场景(使用级联阴影贴图时可能会非常昂贵),但在几乎所有场景中都会产生非常好的结果。当使用现代图形卡和几何着色器时,深度剥离可能会以更快的方式实现,因为它们可以在一次渲染过程中渲染两个深度层。不幸的是,这不是免费的,我还没有使用此技术的经验。我还没有找到任何技术,可以去除彼得平移和阴影痤疮以及双深度层阴影映射。
如果你的半影没有那么大,你可能能够用"正常偏移偏差"取得很好的结果,这在GDC海报上有解释:
霍尔伯特·丹尼尔(2011):"告别阴影粉刺"
实现可能有点棘手,但消除了最坏情况下的陡坡情况。请注意,这种技术还引入了新的瑕疵,因为它会稍微"移动"阴影。
总之:我投票支持具有双深度层阴影映射的PCF,并基于阻塞搜索和过滤步骤实现接触硬化。其他技术,如指数方差阴影图(EVSM)、面积方差总和阴影图(SAVSM)或屏幕空间中的技术(mip映射的屏幕空间阴影图),都具有更复杂的实现、轻度出血或边缘情况,在这些情况下,它们只是失败,需要回退方法。
对于极高质量和物理精确的阴影,您可以考虑多视图阴影贴图(MVSS),它基本上渲染多个阴影贴图并累积其光贡献。它们在这里解释:
Bavoil,Louis(2011):"多视图柔和阴影"
MVSS非常昂贵,并且只能实时用于场景中的主要角色或最重要的对象。它在《蝙蝠侠:阿卡姆城》中为蝙蝠侠本人提供。
祝你好运!:-)