Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

3D 抗锯齿

参见

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

介绍

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

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

图像放大 2 倍并进行最近邻过滤,使锯齿更加明显。

图像放大 2 倍并进行最近邻过滤,使锯齿更加明显。

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

参见

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

多重采样抗锯齿(MSAA)

此功能适用于全部渲染器。

这种技术是处理锯齿的“古早”方法。MSAA 在几何边缘上非常有效(尤其是较高级别时)。MSAA 不会引入任何模糊。

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

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

为了减轻 Alpha Scissor 材质上的锯齿,可以在 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+ 渲染器,不适用于 Mobile 或 Compatibility 渲染器。

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

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

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

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

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

../../_images/antialiasing_taa.webp

AMD FidelityFX Super Resolution 2.2(FSR2)

该功能仅适用于 Forward+ 渲染器,不适用于 Mobile 或 Compatibility 渲染器。

自 Godot 4.2 起,内置了对 AMD 超级分辨率锐画技术 2.2 的支持。这是一种与任何供应商的所有最新 GPU 兼容的放大方法。FSR2 通常旨在通过降低内部 3D 渲染分辨率,然后放大到输出分辨率来提高性能。

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

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

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

../../_images/antialiasing_fsr2_native.webp

备注

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

快速近似抗锯齿(FXAA)

该功能仅适用于 Forward+ 和 Mobile 渲染器,不适用于 Compatibility 渲染器。

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

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

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

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

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

../../_images/antialiasing_fxaa.webp

亚像素形态抗锯齿(SMAA 1x)

该功能仅适用于 Forward+ 和 Mobile 渲染器,不适用于 Compatibility 渲染器。

亚像素形态抗锯齿是一种后期处理抗锯齿方案。其运行速度略慢于 FXAA,但产生的模糊更少。当屏幕分辨率为 1080p 或更低时,此方案非常有效。与 FXAA 类似,由于它缺乏时间信息,因此它对于防止镜面反射锯齿没有多大作用。

如果你无法承受 MSAA 的性能开销,但又觉得 FXAA 过于模糊,可以使用 SMAA 1x。

将其与 TAA 甚至 FSR2 结合使用可以最大化抗锯齿效果,但需要承受更高的 GPU 开销和一些额外的模糊。这在快速移动的场景中或刚刚切换镜头后最为有益,尤其是在较低 FPS 下。

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

无抗锯齿(左)和 SMAA 1x(右)之间的对比:

../../_images/antialiasing_smaa.webp

超采样抗锯齿(SSAA)

此功能适用于全部渲染器。

超采样可以提供最高质量的抗锯齿效果,但它也是成本最高的。它的工作原理是多次对场景中的每个像素进行着色。这允许 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

警告

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

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

屏幕空间粗糙度限制器

该功能仅适用于 Forward+ 和 Mobile 渲染器,不适用于 Compatibility 渲染器。

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

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

屏幕空间粗糙度限制器默认启用,无需任何手动设置。它对性能影响较小,因此如果你的项目受镜面锯齿影响不大,可以考虑禁用它。你可以通过 渲染 > 质量 > 屏幕空间过滤 > 屏幕空间粗糙度限制器 项目设置来禁用它。

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

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

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

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

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

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

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

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

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

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

抗锯齿技术比较

特性

MSAA

TAA

FSR2

FXAA

SMAA 1x

SSAA

SSRL

边缘抗锯齿

🟢 是

🟢 是

🟢 是

🟢 是

🟢 是

🟢 是

🔴 否

镜面反射抗锯齿

🟡 部分

🟢 是

🟢 是

🟡 部分

🟡 部分

🟢 是

🟢 是

透明度抗锯齿

🟡 部分 [1]

🟢 是 [2]

🟢 是 [2]

🟢 是

🟢 是

🟢 是

🔴 否

添加模糊

🟢 无

🟡 部分

🟡 部分

🟡 部分

🟢 低

🟡 部分 [3]

🟢 无

重影伪影

🟢 无

🔴 是

🔴 是

🟢 无

🟢 无

🟢 无

🟢 无

性能开销

🟡 中等

🟡 中等

🔴 高

🟢 非常低

🟢 低

🔴 非常高

🟢 低

Forward+

✔️ 是

✔️ 是

✔️ 是

✔️ 是

✔️ 是

✔️ 是

✔️ 是

移动端

✔️ 是

❌ 否

❌ 否

✔️ 是

✔️ 是

✔️ 是

✔️ 是

兼容

✔️ 是

❌ 否

❌ 否

❌ 否

❌ 否

✔️ 是

❌ 否