3D 抗锯齿

参见

Godot 还支持在 2D 渲染中的抗锯齿。这部分在 2D 抗锯齿 页面中进行了介绍。

前言

由于分辨率有限,以 3D 渲染的场景可能会出现锯齿伪影。 这些伪影通常表现为表面边缘上的“阶梯(staircase)”效应(边缘锯齿)以及反射表面上的闪烁和/或闪烁(镜面锯齿)。

在下面的示例中,你可以注意到边缘如何具有块状外观。 植被也在闪烁,盒子顶部的细线几乎消失了:

图像缩放 2 倍并进行近邻滤波,使混叠现象更加明显。

图像缩放 2 倍并进行近邻滤波,使混叠现象更加明显。

为了解决这个问题,Godot 中可以使用多种抗锯齿技术。 下面详细介绍这些内容。

参见

你可以使用 3D 抗锯齿演示项目 比较实际的抗锯齿算法。

多重采样抗锯齿(MSAA)

这种技术是处理别名效应的“历史”方法。多重采样抗锯齿(MSAA)在几何边缘上非常有效(尤其是在较高级别上)。MSAA不会引入任何模糊。

MSAA有三个级别可供选择:2×、4×、8×。较高级别在抗锯齿边缘方面更有效,但要求更高。在具有现代视觉效果的游戏中,强烈建议使用2×或4×的MSAA,因为8×的MSAA通常要求过高。

MSAA 的缺点是它仅在边缘上运行。 这是因为 MSAA 增加了 覆盖率 样本的数量,但没有增加 颜色 样本的数量。 然而,由于颜色样本的数量没有增加,片段着色器仍然只为每个像素运行一次。 因此,MSAA 不会减少使用 Alpha Scissor 透明度模式(1 位透明度)的材质的透明度锯齿。 此外,MSAA 对镜面反射锯齿也无效。

为了减轻 Alpha 裁剪材质上的锯齿,可以在 StandardMaterial3D 或 ORMMaterial3D 属性中的特定材质上启用 Alpha 抗锯齿(也称为 Alpha 覆盖范围)。Alpha 覆盖范围具有适中的性能成本,但它可以有效减少透明材质上的锯齿,而且不会引入任何模糊。

通过更改 渲染 > 抗锯齿 > 质量 > MSAA 3D 设置的值,可以在项目设置中启用 MSAA。 更改 MSAA 3D 设置的值而不是 MSAA 2D 非常重要,因为这些是完全独立的设置。

无抗锯齿(左)与不同 MSAA 级别(右)之间的比较。 请注意,此处未使用 alpha 抗锯齿:

../../_images/antialiasing_msaa_2x1.webp ../../_images/antialiasing_msaa_4x1.webp ../../_images/antialiasing_msaa_8x1.webp

时间抗锯齿(TAA)

该功能仅适用于集群 Forward 后端,不适用于 Forward 移动或兼容性后端。

时间抗锯齿(Temporal antialiasing)的工作原理是将先前渲染帧的结果 聚合 成单个高质量帧。 这是一个连续的过程,通过在每帧抖动场景中所有顶点的位置来工作。 这种抖动是为了捕捉子像素细节,除非在极端情况下,否则(抖动)应该是不明显的。

此技术在现代游戏中常用,因为它提供了针对镜面反射锯齿和其他着色器引起的伪影的最有效的抗锯齿方式。 此外,TAA 还全面支持透明度抗锯齿。

在静止场景中启用 TAA 会产生少量模糊,而当相机移动时,这种模糊效果会变得更加明显。 TAA 的另一个缺点是它可能会在移动物体后面呈现 重影(ghosting) 伪影。 以更高的帧速率进行渲染将使 TAA 收敛得更快,从而使这些重影伪像变得不那么明显。

通过在项目设置中更改 渲染 > 抗锯齿 > 质量 > 使用 TAA 的配置,可以启用时间抗锯齿功能。

无抗锯齿(左)和 TAA(右)之间的比较:

../../_images/antialiasing_taa.webp

AMD FidelityFX Super Resolution 2.2 (FSR2)

Since Godot 4.2, there is built-in support for AMD FidelityFX Super Resolution 2.2. This is an upscaling method compatible with all recent GPUs from any vendor. FSR2 is normally designed to improve performance by lowering the internal 3D rendering resolution, then upscaling to the output resolution.

然而,与 FSR1 不同的是,FSR2 有时间抗锯齿功能。这意味着 FSR2 可以在原始分辨率下使用,以获得高质量的抗锯齿效果,并且输入分辨率等于输出分辨率。在这种情况下,启用 FSR2 实际上会 降低 性能,但会显着提高渲染质量。

在原始分辨率下使用 FSR2 比在原始分辨率下使用 TAA 要求更高,因此,仅在你有足够大的 GPU 显存空间时才建议使用它。从好的方面来说,与 TAA 相比,FSR2 提供了更好的抗锯齿覆盖范围和更少的模糊度,尤其是在运动画面中。

无抗锯齿(左)和原始分辨率下的 FSR2(右)之间的比较:

../../_images/antialiasing_fsr2_native.webp

备注

默认情况下, FSR 锐度 项目设置设置为 0.2 (值越高,锐化程度越低)。为了进行比较,在以上的屏幕截图中,FSR 锐度被设置为 2.0 ,从而禁用了 FSR 锐化。

快速近似抗锯齿(FXAA)

该功能仅适用于集群 Forward 和 Forward 移动后端,不适用于兼容性后端。

快速近似抗锯齿是一种后期处理抗锯齿解决方案。 它的运行速度比任何其他抗锯齿技术都要快,并且还支持抗锯齿透明度。 然而,由于它缺乏时间信息,因此它对于防止镜面反射锯齿没有多大作用。

这种技术有时仍会在手机游戏中使用。 然而,在桌面平台上,FXAA 通常已经是过时的,取而代之的是时间抗锯齿,后者对于对抗镜面反射锯齿更为有效。 尽管如此,对于只有低端 GPU 的玩家来说,将 FXAA 作为游戏内选项可能仍然是值得的。

FXAA 启用后会产生适度的模糊(静止时比 TAA 多,但相机移动时比 TAA 少)。

可以在项目设置中启用 FXAA,方法是将 渲染 > 抗锯齿 > 质量 > 屏幕空间 AA 设置的值更改为 FXAA

无抗锯齿(左)和 FXAA(右)之间的对比:

../../_images/antialiasing_fxaa.webp

超采样抗锯齿(SSAA)

该功能仅适用于集群 Forward 和 Forward 移动后端,不适用于兼容性后端。

超采样可以提供最高质量的抗锯齿效果,但它也是成本最贵的。 它的工作原理是多次对场景中的每个像素进行着色。 这允许 SSAA 同时抗锯齿边缘、透明度 镜面反射锯齿,而不会引入潜在的重影伪影。

SSAA 的缺点是其 极高 的成本。 这种成本通常会使 SSAA 难以用于游戏目的,但你可能仍会发现超采样对于 离线渲染 很有用。

超采样抗锯齿是通过将高级项目设置中 渲染 > 缩放 3D > 缩放 的设置增加到 1.0 以上来执行的,同时确保 渲染 > 缩放 3D > 模式 设置为 Bilinear (默认) 。 由于比例因子是按轴定义的,比例因子 1.5 将导致 2.25× SSAA,而比例因子 2.0 将导致 4× SSAA。由于 Godot 使用硬件自身的双线性过滤来执行降采样,因此结果在整数的比例因子(即 2.0 )下看起来会更清晰。

无抗锯齿(左)与不同 SSAA 级别(右)之间的比较:

../../_images/antialiasing_ssaa_2.25x.webp ../../_images/antialiasing_ssaa_4x.webp

警告

超采样还有很高的视频 RAM (即显存)要求,因为它需要以目标分辨率渲染,然后 缩小 到窗口大小。 例如,使用 4× SSAA 显示 3840×2160(4K 分辨率)的项目需要以 7680×4320(8K 分辨率)渲染场景,这是原像素数的 4 倍。

如果你使用较大的窗口大小(例如 4K),你可能会发现将分辨率比例增加到超过特定值时,会因 VRAM 耗尽而导致严重减速(甚至崩溃)。

屏幕空间粗糙度限制器

该功能仅适用于集群 Forward 和 Forward 移动后端,不适用于兼容性后端。

这并不是一种边缘抗锯齿方法,而是减少 3D 镜面反射锯齿的一种方法。

屏幕空间粗糙度限制器最适合详细的几何形状。 虽然它对粗糙度图渲染本身有影响,但其影响有限。

屏幕空间粗糙度限制器默认启用; 它不需要任何手动设置。 它对性能影响很小,因此如果你的项目不受镜面反射锯齿影响太多,请考虑禁用它。

导入时的纹理粗糙度限制器

与屏幕空间粗糙度限制器一样,这也不是一种边缘抗锯齿方法,而是减少 3D 镜面反射锯齿的一种方法。

通过指定法线贴图来限制导入的粗糙度,以用作限制粗糙度的指导。 这是通过在文件系统面板中选择粗糙度图来完成的,然后转到导入面板并将 粗糙度>模式 设置为存储粗糙度图的颜色通道(通常为 绿色 ),然后设置材质法线贴图的路径。 在设置法线贴图的路径后,请别忘记单击导入面板底部的 重新导入

由于此处理仅在导入时进行,因此没有任何性能成本。 但其视觉效果改善有限。 限制导入时的粗糙度仅有助于减少纹理内的镜面反射锯齿,而无助于减少详细网格上的几何边缘上发生的锯齿。

我应该使用哪种抗锯齿技术?

没有“一招鲜”的抗锯齿技术 。 由于抗锯齿通常对 GPU 要求很高,或者可能会引入不必要的模糊,因此你需要添加一个设置以允许玩家禁用抗锯齿。

对于具有照片级拟真艺术目标的项目,通常来说 TAA 是最合适的选择。虽然 TAA 会引入重影伪像,但没有其他技术能像 TAA 那样对抗镜面反射锯齿。屏幕空间粗糙度限制器也有点用,但总体上对镜面反射锯齿的效果要差得多。如果你的 GPU 性能不错,则可以在原始分辨率下使用 FSR2,以获得比标准 TAA 更好的时间抗锯齿。

对于反射表面较少的项目(例如卡通艺术风格),MSAA 可以表现很好。如果(对项目而言)避免模糊和时域伪影很重要,例如在竞技游戏中,MSAA 也是一个不错的选择。

在针对移动或集成显卡等低端平台时,FXAA 通常是唯一可行的选择。2× MSAA 在某些情况下可能可用,但更高的 MSAA 级别不太可能在移动 GPU 上流畅运行。

Godot 允许同时使用多种抗锯齿技术。这通常是不必要的,但在高端 GPU 上或在 非实时渲染 中可以提供更好的视觉效果。例如,为了在启用 TAA 时让移动边缘看起来更好,还可以同时启用 MSAA。