屏幕空间全局光照
UE4 时代的屏幕空间全局光照(Screen-Space Global Illumination, SSGI)通过 r.SSGI.Enable 1 启用。建议与 DDGI 配合使用,而非替代 DDGI:DDGI 提供世界尺度的反弹光,而 SSGI 提供高频接触细节。无需光线追踪硬件。
屏幕空间全局光照通过采样深度和颜色缓冲区来收集间接光。它仅感知屏幕上的内容,这既是它的最大局限性,也是它与世界空间全局光照解决方案完美互补的原因。
为什么这在 Vite 中尤为重要?
由于 SSGI 被集成到 Lumen 中,UE5 中的 SSGI 在质量和性能方面都出现了退步,并且无法再将其与独立的全局光照解决方案同时启用。
Vite 保留了 UE4 时代的实现方式,这种方式速度更快且更易于组合。SSGI 与 DDGI 并行运行是推荐的默认配置,而非特殊组合。
每种技术的作用
| DDGI | SSGI | |
|---|---|---|
| 空间分辨率 | 探测网格 | 逐像素 |
| 了解屏幕外几何体 | 是 | 否 |
| 了解遮挡几何体 | 是 | 否 |
| 捕捉接触尺度细节 | 否 | 是 |
| 需要光线追踪硬件 | 是(动态模式) | 否 |
| 相机运动下稳定 | 是 | 帧边缘出现屏幕空间伪影 |
这两种方法的不足之处恰恰相反,这正是我们希望它们结合使用的原因。DDGI 拥有粗分辨率下的完整世界信息;SSGI 则在不完整的视图上提供像素分辨率。它们结合起来可以覆盖两种尺度。
具体来说,SSGI 技术能够实现椅子腿与地面接触处的暗化效果、物体间狭窄缝隙内的反弹效果,以及附近红色墙壁的颜色晕染到角色肩膀上的效果——所有这些细节都比典型的探测间距要小。
启用
IConsoleManager::Get().FindConsoleVariable(TEXT("r.SSGI.Enable"))->Set(1);
; Config/DefaultEngine.ini
[/Script/Engine.RendererSettings]
r.SSGI.Enable=1
SSGI 质量通过标准的 UE4 SSGI 控制台变量和后处理体积进行控制。质量设置以通常的方式在光线数量和分辨率与成本之间进行权衡。
设计时需要考虑的局限性
所有屏幕空间渲染都存在相同的失效模式,了解这些模式有助于避免将其误判为 bug:
屏幕外光照缺失。 视锥体外的明亮墙壁不会产生任何贡献。当摄像机旋转并进入视野时,其贡献才会显现。这就是为什么单独使用 SSGI 并非可行的全局光照解决方案,以及为何需要与其他渲染器组合的原因。
被遮挡的几何体缺失。 SSGI 只能看到深度缓冲区的正面。本应从物体后方反射的光线无法被表示。
帧边缘。 由于采样内核缓冲区不足,贡献会向屏幕边缘逐渐消失。这通常是可以接受的,但在摄像机快速移动时会变得明显。
由于 DDGI 提供的是世界尺度的全局光照,因此在组合设置中,这些缺陷都不会导致图像错误——它们只会生成局部细节较少的图像,这是一种更好的失效模式。
成本
相对于任何世界空间技术而言,SSGI 的成本都很低,而且它的成本与分辨率和质量设置成正比,而非与场景复杂度成正比。在包含 SSGI 的性能目标中,它并非主要的成本来源;DDGI 和反射才是。
如果您追求帧时间,请在禁用 SSGI 之前进行测量。stat gpu 命令会告诉您该通道在您的场景中的实际成本,通常比人们预想的要低。