不幸的是,没有通用的方法可以产生无伪影的阴影,但我可能会给你一些提示。
百分比更紧密的过滤不仅是一个很好的起点,也是接触硬化阴影的基础(如果您有兴趣,我可能会提供有关它的更多信息)。 PCF 基本上比方差阴影映射 (VSM) 或指数阴影映射 (ESM) 等统计算法产生更好的结果,但速度较慢,因为过滤步骤需要 O(n²) 而不是 O(n) 中的可分离滤波器。另一方面,轻微出血是一种疼痛,不能完全消除。
减少甚至去除阴影粉刺的最佳方法是双深度层阴影贴图,这是对中点阴影贴图的改进。这两种算法都在本文中进行了解释:
Weiskopf D.,Ertl T.(2003 年):“Shadow Mapping Based on Dual Depth Layers”。
该技术需要对每个阴影贴图进行额外的场景渲染(在使用级联阴影贴图时可能会非常昂贵),但在几乎所有场景中都能产生非常好的效果。使用现代图形卡和几何着色器时,深度剥离可能会以更快的方式实现,这可以在一次渲染过程中渲染两个深度层。不幸的是,这不是免费的,我还没有使用这种技术的经验。我还没有找到任何可以去除彼得平移和阴影粉刺以及双深度层阴影映射的技术。
如果你的半影不是那么大,你也许可以通过“正常偏移偏差”获得很好的结果,这在 GDC 海报上进行了解释:
Holbert Daniel (2011):“Saying goodbye to shadow acne”。
实现可能有点棘手,但消除了陡坡的最坏情况。请注意,此技术还引入了新的伪影,因为它稍微“移动”了阴影。
总结:我投票支持具有双深度层阴影映射的 PCF,并基于阻塞搜索和过滤步骤实现接触强化。其他技术,如指数方差阴影贴图 (EVSM)、总面积方差阴影贴图 (SAVSM) 或屏幕空间技术(mip-mapped 屏幕空间阴影贴图)都具有更复杂的实现、光溢出或边缘情况,它们只是失败需要后备方法。
对于质量极高且物理精确的阴影,您可以考虑使用多视图阴影映射 (MVSS),它基本上会渲染多个阴影贴图并累积它们的光照贡献。它们在这里解释:
Bavoil, Louis (2011):“Multi-View Soft Shadows”。
MVSS 很昂贵,只能实时用于主角或场景中最重要的对象。蝙蝠侠本人在“蝙蝠侠:阿卡姆之城”中可以使用它。
祝你好运! :-)