Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

带符号距离场全局光照(SDFGI)

带符号距离场全局光照(SDFGI)是 Godot 4.0 中提供的一种新技术。它提供了半实时的全局光照,可以适用于任何世界大小,并且适用于程序化生成的关卡。

SDFGI 支持动态光源,但不支持动态遮挡物或动态发光表面。因此,SDFGI 提供了比烘焙光照贴图更好的实时能力,但比 VoxelGI 的实时能力要差。

从能效角度来看,SDFGI 是 Godot 中要求最高全局光照技术之一。与 VoxelGI 相同,仍有许多设定可用于调整其性能要求,但会牺牲品质。

重要

SDFGI 仅在使用 Forward+ 渲染后端时受支持,而不支持 Forward 移动或兼容后端。

参见

如果你不确定SDFGI是否符合你的需求,请查看 我应该使用哪种全局光照技术? 以了解 Godot 4 中可用的 GI 技术的比较。

视觉比较

禁用 SDFGI。

禁用 SDFGI。

启用 SDFGI。

启用 SDFGI。

设置 SDFGI

在Godot中,SDFGI是启用所需步骤最少的全局光照技术:

  1. 请确保你的 MeshInstance 节点在检查器中将其 Global Illumination > Mode 属性设置为 Static

  • 对于导入的3D场景,可以在选择文件系统窗口中的3D场景文件后,在导入窗口中配置烘焙模式。

  1. 添加一个WorldEnvironment节点并为其创建一个Environment资源。

  2. 编辑Environment资源,向下滚动到 SDFGI 部分并展开它。

  3. 启用 SDFGI > Enabled 。SDFGI 将在相机移动时自动跟随,因此无需配置范围(与 VoxelGI 不同)。

环境 SDFGI 属性

在 Environment 资源中,有几个属性可用于调整 SDFGI 的外观和质量:

  • 使用遮挡(Use Occlusion): 如果启用,SDFGI 将投射额外的射线以寻找并减少光线泄漏。这会带来性能开销,所以只有在你实际需要时再启用此属性。

  • 读取天空光(Read Sky Light): 如果启用,环境照明将在全局照明中表现。 应在室外场景中启用此功能,并在完全室内场景中禁用此功能。

  • 反弹反馈(Bounce Feedback): 默认情况下,使用 SDFGI 时,间接光照只会反弹一次。将此值设置为大于 0.0 将使SDFGI反弹多次,以在性能上稍微付出代价的情况下提供更逼真的间接光照。根据场景,合理的值通常在 0.31.0 之间。请注意,在某些场景中,大于 0.5 的值可能会导致无限反馈循环发生,使场景在几秒钟内变得极其明亮。如果你的间接光照看起来是"斑点状",考虑将此值增加到大于 0.0 以获得更均匀的光照效果。如果由此导致你的光照看起来太亮,可以降低 能量(Energy) 来进行补偿。

  • 级联(Cascades): 较高的值会产生更详细的 GI 信息(以及 / 或者更大的最大距离),但在 CPU 和 GPU 上的成本明显更高。 当相机快速移动时,拥有更多级联的性能成本尤其会增加,因此如果你的相机移动速度很快,请考虑将这个值减少到 4 或更低。

  • 最小单元格尺寸(Min Cell Size): 用于最近、最详细级联的最小 SDFGI 单元尺寸。 较低的值会导致更准确的间接照明和反射,但代价是性能较低。 调整此设置还会自动影响 级联 0 距离(Cascade 0 Distance)最大距离(Max Distance)

  • 级联 0 距离(Cascade 0 Distance): 最近、最详细的级联结束的距离。 值越大,最近的级联过渡越不明显,但代价是降低最近级联的细节层次(level of detail)。 调整此设置还会自动影响 最小单元格尺寸(Min Cell Size)最大距离(Max Distance)

  • 最大距离(Max Distance): 控制计算有符号距离场的距离(对于最不详细的级联)。 SDFGI 对超过此距离不会产生任何影响。 该值应始终设置为低于相机的远值(far value),因为计算超过观看距离的 SDFGI 没有任何好处。 调整此设置还会自动影响 最小单元格尺寸(Min Cell Size)级联 0 距离(Cascade 0 Distance)

  • Y 比例(Y Scale):控制 SDFGI 探针垂直分布的距离。 默认情况下,垂直传播与水平传播相同。 然而,由于大多数游戏场景不是高度垂直的,因此将 Y 比例设置为 75% 甚至 50% 可以提供更好的质量并减少漏光,而不会影响性能。

  • 能量(Energy): SDFGI 间接照明的亮度乘数。

  • 法线偏置(Normal Bias): 用于 SDFGI 探测射线反弹的法线偏置。 与 探针偏差(Probe Bias) 不同,这只会增加相对于网格法线的值。 这使得偏置调整更加细致,避免无缘无故地增加太多偏置。 如果你发现间接照明或反射中出现条纹伪影(striping artifacts),请增加此值。

  • 探针偏置(Probe Bias): 用于 SDFGI 探测射线反弹的偏置。 如果你发现间接照明或反射中出现条纹伪影,请增加此值。

SDFGI 与灯光和对象的交互

光发出的间接能量的量由其颜色、能量 间接能量属性决定。 要使特定灯光发出或多或少的间接能量,而不影响灯光发出的直接光的量,请在 Light3D 检查器中调整 间接能量(Indirect Energy) 属性。

为了确保使用 SDFGI 时获得正确的视觉效果,你必须根据场景中的 用途 (静态方式或动态方式)配置网格和灯光的全局照明属性。

网格有 3 种全局光照模式可选:

  • Disabled: (即禁用)SDFGI 生成中不会考虑网格。 网格物体将接收来自场景的间接光照,但不会向场景贡献间接光照。

  • Static (默认): (静态方式)SDFGI 生成中将考虑网格。 网格将接收 为场景提供间接照明。 如果在生成 SDFGI 后网格以任何方式发生更改,则相机必须远离对象然后移回靠近对象,以便 SDFGI 重新生成。 或者,可以关闭然后重新打开 SDFGI。 如果两者都不做,间接照明就会看起来不对劲。

  • Dynamic (SDFGI 不支持): (动态方式)SDFGI 生成中不会考虑网格。 网格物体将接收来自场景的间接光照,但不会向场景贡献间接光照。这与使用 SDFGI 时的 **禁用* 烘焙模式相同。*

此外,对于灯光(DirectionalLight3D、OmniLight3D 和 SpotLight3D),还有三种可用的烘焙模式:

  • Disabled: (禁用) SDFGI 烘焙不会考虑光线。 该灯光不会为场景提供间接照明。

  • Static: (静态方式)SDFGI 烘焙时将考虑光线。 灯光将为场景提供间接照明。 如果烘焙后灯光以任何方式发生变化,间接照明将看起来并不正确,直到相机远离灯光并返回(这会导致 SDFGI 再次烘焙)。 会看起来不正确。 如果有疑问,请使用此模式进行水平照明(level lighting)。

  • Dynamic (默认): (动态方式)SDFGI 烘焙不会考虑灯光,但它仍会实时为场景提供间接照明。 与 静态方式 相比,此选项速度较慢。 仅对游戏过程中会发生显着变化的灯光使用 动态方式 全局照明模式。

备注

光发射的间接能量取决于它的颜色、能量以及间接能量特性。若要使特定灯光或多或少地发射间接能量而不影响灯光发射的直接光量,请调整 Light3D 检查器中的 Indirect Energy 属性。

调整 SDFGI 性能和质量

由于 SDFGI 要求相对较高,因此它在配备最新专用 GPU 的系统上表现最佳。 在较旧的专用 GPU 和集成显卡上,需要调整设置才能获得合理的性能。

在项目设置的 渲染 > 全局光照 部分,还可以通过几种方式调整SDFGI的质量:

  • SDFGI > 探测射线数: 值越高,质量越好,但代价是 GPU 使用率较高。 如果该值设置得太低,则由于投射的光线数量非常少,可能会导致表面上出现可见的间接照明“斑点”。

  • SDFGI > 收敛帧数: 值越高,质量越好,但 GI 需要更多时间才能完全收敛。 当首次加载场景时,或者当具有除 禁用 之外的烘焙模式的灯光快速移动时,此设置的效果尤其明显。 如果该值设置得太低,则由于投射的光线数量非常少,可能会导致表面上出现可见的间接照明“斑点”。 如果你的场景照明没有有助于 GI 的快速移动灯光,请考虑将其设置为 30 以提高质量而不影响性能。

  • SDFGI > 更新灯光帧数: 较低的值会导致移动灯光反射得更快,但代价是 GPU 使用率更高。 如果你的场景照明没有有助于 GI 的快速移动灯光,请考虑将其设置为 16 以提高性能。

  • 全局光 > 半分辨率: 如果启用,SDFGI 和 VoxelGI 都将以减半的分辨率渲染 GI 缓冲区。 例如,当以 3840×2160 渲染时,GI 缓冲区将以 1920×1080 分辨率计算。 启用此选项可以节省大量 GPU 时间,但它可能会在薄细节周围引入可见的锯齿。

SDFGI 渲染性能还取决于级联数量和环境资源中选择的单元大小(见上文)。

一些 SDFGI 的注意事项

SDFGI 由于其级联性质而有一些缺点。当摄影机移动时,在间接照明中可能会看到级联移动。这可以通过调整级联的大小来缓解,也可以通过添加雾效来缓解(这将使远处的级联偏移不那么明显)。

此外,如果相机移动过快,性能也会受到影响。这可以通过两种方式解决:

  • 确保相机在任何特定情况下都不会移动过快。

  • 如果需要高速移动摄影机,请在环境资源中暂时禁用 SDFGI,然后在摄影机速度减慢时启用 SDFGI。

启用 SDFGI 时,全局照明也需要一些时间才能完全收敛(默认情况下为25帧)。这可以在GI(全局光照)仍在收敛时产生明显的过渡效果。若要隐藏此内容,可以使用跨整个视口的 ColorRect 节点,并在使用 AnimationPlayer 节点切换场景时将其淡出。

仅当摄像机移入和移出级联时,才会更新带符号距离场。这意味着,如果在远处修改几何图形,则一旦相机靠近,全局光照的外观将是正确的。但是,如果移动烘焙模式设置为**静态**或**动态**的附近对象(例如门),则全局照明将不正确,直到摄像机远离该对象。

SDFGI 的锐利反射仅在不透明材料上可见。透明材质只会使用粗糙的反射,即使材质的粗糙度低于 0.2。