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.
Checking the stable version of the documentation...
可变速率着色
什么是可变速率着色?
在现代 3D 渲染引擎中,着色器比以前复杂得多。基于物理的渲染、实时全局照明和屏幕空间效果的出现,增加了渲染每帧时必须执行的逐像素着色次数。此外,屏幕分辨率也大幅提升,1440p 和 4K 已成为常见的目标分辨率。因此,场景渲染中的总着色开销通常占渲染每帧所花费时间的很大一部分。
可变速率着色 (variable rate shading, VRS) 是一种通过降低逐像素着色(也称为片段着色)的分辨率来减少着色开销的方法,同时保持渲染几何体的原始分辨率。这意味着几何边缘仍然像没有 VRS 时一样锐利。VRS 可以与任何 3D 抗锯齿技术(MSAA、FXAA、TAA、SSAA)结合使用。
VRS 允许以局部方式指定着色质量,这使得视口的某些部分可以比其他部分接收更详细的着色。这在虚拟现实 (VR) 中特别有用,可实现注视点渲染(foveated rendering),即视口中心比边缘更精细。
这是使用本页底部链接的密度图渲染的场景,先禁用速率着色,然后启用速率着色:
在纹理场景中禁用可变速率着色
在纹理场景中启用可变速率着色(质量较低,但性能较高)
当用于具有低频细节的场景(例如具有风格化/低多边形艺术风格的场景)时,可以获得类似的性能提升,但视觉质量损失更少:
在无纹理场景中禁用可变速率着色
在无纹理场景中启用可变速率着色(质量较低,但性能较高)
硬件支持
可变速率着色仅在特定 GPU 上受支持:
桌面端:
NVIDIA Turing 及更新版本(包括 GTX 1600 系列)
AMD RDNA2 及更新版本(集成和独立 GPU——包括 Steam Deck)
Intel Arc Alchemist 及更新版本 (仅限独立 GPU)
英特尔集成显卡不支持可变速率着色。
移动端 SoC:
骁龙(Snapdragon)888 及更新版本
MediaTek 天玑 9000 及更新版本
ARM Mali-G615 及更新版本
截至 2023 年 1 月,Apple 和 Raspberry Pi GPU 仍不支持可变速率着色。
在 Godot 中使用可变速率着色
备注
Forward+ 和 Mobile 渲染器都支持可变速率着色。VRS 可用于 pancake(非 XR)和 XR 显示模式。
兼容性渲染器不支持可变速率着色。对于 XR,你可以使用注视点级别作为替代方案。
在高级项目设置中,渲染 > VRS部分提供了控制根视口上可变速率着色的设置:
模式:控制可变速率着色模式。Disabled 禁用可变速率着色。Texture 使用手动创作的纹理来设置着色密度(请参阅下方的属性)。XR 自动生成适合虚拟/增强现实中注视点渲染的纹理。
纹理:用于控制根视口上着色密度的纹理。仅当 Mode 为 Texture 时使用。
对于自定义视口,必须手动将 VRS 模式和纹理设置到 Viewport 节点。
备注
在不受支持的硬件上,启用可变速率着色时不会出现视觉差异。你可以通过使用 --verbose 命令行参数运行编辑器或项目来检查硬件是否支持可变速率着色。
创建 VRS 密度图
如果使用 Texture VRS 模式,必须 设置要用作密度图的纹理。否则,将看不到任何效果。
你可以使用图像编辑器手动创建自己的 VRS 密度图,或使用其他方法生成(例如,在 CPU 上使用 Image 类,或在 GPU 上使用着色器)。但是,动态生成 VRS 图像时请注意其性能影响。如果选择动态生成,请确保 VRS 图像生成过程足够快,以免抵消 VRS 带来的性能提升。
纹理必须遵循以下规则:
纹理必须使用无损压缩格式,以便颜色可以精确匹配。
以下 VRS 密度映射到各种颜色,较亮的颜色表示较低级别的着色精度:
密度 |
Color |
注释 |
|---|---|---|
1×1(最高细节) |
|
|
1×2 |
|
|
2×1 |
|
|
2×2 |
|
|
2×4 |
|
|
4×2 |
|
|
4×4 |
|
|
4×8 |
|
大多数硬件不支持。 |
8×4 |
|
大多数硬件不支持。 |
8×8(最低细节) |
|
大多数硬件不支持。 |
例如,此 VRS 密度纹理在视口中心提供最高的着色密度,在角落提供最低的着色密度:
VRS 密度图纹理示例,模拟注视点渲染
VRS 密度纹理没有尺寸或长宽比要求。但是,使用大于视口分辨率除以 GPU图块大小的 VRS 密度图并没有任何好处。图块大小决定了可以与其他图块分开更改着色密度的最小像素区域。在大多数 GPU 上,此图块大小为 8×8 像素。你可以通过使用 --verbose 命令行参数运行 Godot 来查看图块大小,正如 VRS 调试信息中打印的那样。
因此,建议保持使用相对较低的分辨率,例如 256×256(正方形)或 480×270(16:9)。根据你的用例,与项目中最常见的视口长宽比(例如 16:9)相匹配的纹理相比,正方形纹理可能更合适。
小技巧
使用可变速率着色时,你可以使用负纹理 mipmap LOD 偏置来减少着色率降低区域的模糊度。
请注意,纹理 LOD 偏置是全局设置的,因此这也会影响具有完整着色率的视口区域。不要使用太低的值,否则纹理将会显得有颗粒感。
性能比较
为了了解 VRS 在理论上可以提高多少性能,以下是与本页顶部显示的纹理示例场景的性能比较。使用的是本页提供的 VRS 密度图示例。
结果是在配备 NVIDIA 525.60.11 驱动程序的 GeForce RTX 4090 上采集的。
分辨率 |
禁用 VRS |
启用 VRS |
性能提升 |
|---|---|---|---|
1920×1080(全高清) |
2832 FPS |
3136 FPS |
+10.7% |
2560×1440(QHD) |
2008 FPS |
2256 FPS |
+12.3% |
3840×2160(4K) |
1236 FPS |
1436 FPS |
+16.2% |
7680×4320(8K) |
384 FPS |
473 FPS |
+23.1% |
就性能提升而言,可变速率着色在更高的目标分辨率下更有益。在高分辨率下,视觉质量的下降也不太明显。
备注
对于非 VR 游戏,你可能需要使用比本示例中更保守的 VRS 纹理。因此,实际的性能提升将会降低。