2

我正在尝试找到用于我的游戏引擎的最佳阴影映射技术。到目前为止,我已经使用 PCF、级联阴影贴图和方差阴影贴图实现了标准阴影贴图。然而,它们似乎都没有提供令人满意的结果。

我正在尝试为所有情况找到最佳阴影映射方法。我需要背面正确的几何形状,因此可以使用渲染背面。然而,我也有相当多的低多边形平滑法线几何,即使在绘制背面时也会导致一些非常难看的粉刺。

还有哪些其他技术可以用来获得漂亮的阴影贴图,没有严重的粉刺、彼得平移或轻微出血,而且不对几何体施加任何主要限制(仅背面)?

4

1 回答 1

2

不幸的是,没有通用的方法可以产生无伪影的阴影,但我可能会给你一些提示。

百分比更接近过滤不仅是一个很好的起点,也是接触硬化阴影的基础(如果您有兴趣,我可能会提供有关它的更多信息)。PCF 基本上比方差阴影映射 (VSM) 或指数阴影映射 (ESM) 等统计算法产生更好的结果,但速度较慢,因为过滤步骤需要 O(n²) 而不是 O(n) 中的可分离滤波器。另一方面,轻微出血是一种疼痛,不能完全去除。

减少甚至去除阴影粉刺的最佳方法是双深度层阴影贴图,这是对中点阴影贴图的改进。本文解释了这两种算法:

Weiskopf D., Ertl T. (2003):“基于双深度层的阴影映射”。

该技术需要对每个阴影贴图进行额外的场景渲染(当您使用级联阴影贴图时可能会非常昂贵),但在几乎所有场景中都能产生非常好的结果。当使用现代显卡和几何着色器时,深度剥离可能会以更快的方式实现,这可以在一次渲染过程中渲染两个深度层。不幸的是,这不是免费的,我还没有使用这种技术的经验。我还没有找到任何可以消除彼得平移和阴影粉刺以及双深度层阴影映射的技术。

如果你的半影不是那么大,你也许可以通过“正常偏移偏差”获得很好的结果,这在 GDC 海报上进行了解释:

霍尔伯特丹尼尔 (2011):“告别暗影粉刺”。

实现可能有点棘手,但消除了陡坡的最坏情况。请注意,此技术还引入了新的伪影,因为它稍微“移动”了阴影。

总结:我投票支持具有双深度层阴影映射的 PCF,并基于阻塞搜索和过滤步骤实现接触强化。其他技术,如指数方差阴影贴图 (EVSM)、总面积方差阴影贴图 (SAVSM) 或屏幕空间技术(mip-mapped 屏幕空间阴影贴图)都具有更复杂的实现、光溢出或边缘情况,它们只是失败需要后备方法。

对于极高质量和物理上精确的阴影,您可以考虑多视图阴影映射 (MVSS),它基本上渲染多个阴影贴图并累积它们的光贡献。它们在这里解释:

Bavoil, Louis (2011):“多视图软阴影”。

MVSS 很昂贵,只能实时用于主角或场景中最重要的对象。它在蝙蝠侠本人的“蝙蝠侠:阿卡姆城”中可用。

祝你好运!:-)

于 2015-05-07T13:56:48.237 回答