【问题标题】:Modern artifact-free shadow mapping现代无伪影阴影映射
【发布时间】:2015-03-01 03:42:44
【问题描述】:

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

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

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

【问题讨论】:

    标签: opengl 3d shadow-mapping


    【解决方案1】:

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

    百分比更紧密的过滤不仅是一个很好的起点,也是接触硬化阴影的基础(如果您有兴趣,我可能会提供有关它的更多信息)。 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 很昂贵,只能实时用于主角或场景中最重要的对象。蝙蝠侠本人在“蝙蝠侠:阿卡姆之城”中可以使用它。

    祝你好运! :-)

    【讨论】:

    • 这是一个非常棒的答案。自从我提出这个问题以来,我在阴影着色器上做了很多工作。我得到的是正常偏移阴影和斜率缩放偏差的组合。实际上,我似乎已经为他们找到了那些神奇的完美参数,效果非常好。实际上,我什至没有听说过双深度层方法,考虑到我对阴影贴图所做的大量研究,这令人惊讶。但是,从外观上看,它会非常昂贵,并且绘制阴影贴图已经是我的渲染器中比较昂贵的部分之一。
    • 我将研究多视图软阴影,但缺乏接触硬化并没有真正困扰我,正如你所说,大型 PCF 内核在提供美观方面做得很好,即使不准确,半影。无论如何,感谢您的出色回答!
    • 前两个链接现在已经烂了。
    猜你喜欢
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多