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 渲染引擎中,全局光照是实现逼真照明的最重要要素之一。全局光照旨在模拟现实生活中光线的行为,例如光线在表面上反弹以及从自发光材质中发出的光线。

在下方的示例中,整个场景由一个自发光材质(顶部的白色方块)照亮。背景中的白色墙壁和天花板在靠近墙壁的地方分别带有红色和绿色的色调,因为彩色墙壁上反弹的光线又被反射回场景的其他部分。

../../../_images/global_illumination_example.webp

全局光照由以下几个关键概念组成:

间接漫反射光照

这种光照不会因相机的角度而改变。间接漫反射光照有两个主要来源:

  • 光线在表面上的反弹。这种反弹后的光照会与材质的反照率颜色相乘。随后,反射的光照可被其他表面再次反射,但由于光线衰减,影响会逐渐减小。在现实中,光线会反弹无限次。但出于性能考虑,无法在游戏引擎中进行这样的模拟。相反,反弹次数通常限制为 1 或 2 次(烘焙光照贴图时最多为 16 次)。更多的反弹次数会在阴影区域带来更真实的光线衰减效果,但代价是性能降低或烘焙时间更长。

  • 自发光材质也可以发出能在表面上反弹的光线。这充当了一种区域照明。与使用 OmniLight3D 或 SpotLight3D 节点让一个无限小的点发出不同,确定大小的区域会使用自己的表面发出光线。

直接漫反射光照已经由灯光节点本身处理,这意味着全局光照算法只负责表示间接光照。

不同的全局光照技术提供不同级别的精度来表示间接漫反射光照。有关详细信息,请参阅本页底部的比较表。

为了给较小的对象提供更精确的环境光遮蔽,可以在环境设置中启用屏幕空间环境光遮蔽(SSAO)。SSAO 具有较大的性能开销,因此在针对低端硬件时请确保禁用它。

备注

间接漫反射光照可能是缺乏细节纹理的场景中出现色带的源头。这导致光照渐变不平滑,而是呈现出可见的“阶梯”效应。减少这种效果的方法见 3D 渲染限制文档中的带状颜色部分。

镜面反射光照

镜面反射光照也被称为 反射。这是会因相机角度而变化强度的光照。这种镜面光照可以是直接的间接的

大多数全局光照技术都提供了一种渲染镜面反射光照的方法。然而,不同技术在渲染镜面反射光照方面的精度差异很大。有关详细信息,请参阅本页底部的比较表。

为了给较小的对象提供更准确的反射,可以在环境设置中启用屏幕空间反射(SSR)。SSR 的性能开销很大(甚至比 SSAO 更高),因此在针对低端硬件时一定要禁用它。

我应该使用哪种全局光照技术?

在确定要使用哪种全局光照(GI)技术时,需要考虑以下几个标准:

  • 性能。与半实时或烘焙技术相比,实时 GI 技术的成本通常更高。请注意,GI 渲染的大部分开销都花在了 GPU 上,而不是 CPU 上。

  • 视觉效果。除了不能达到最佳性能外,实时 GI 技术通常也无法提供最佳的视觉输出。这在大多数静态场景中尤为明显,其中实时 GI 的动态特性不容易被察觉。如果你的目标是最优化视觉效果,那么烘焙技术通常会看起来更好,并且会产生更少的漏光。

  • 实时能力。一些 GI 技术是完全实时的,而其他技术只是半实时或根本非实时。半实时技术有完全实时技术所没有的限制。例如,动态物体可能不会向场景贡献自发光照明。非实时技术不支持任何形式的动态 GI,因此如有需要,必须使用其他技术进行模拟(例如在发光表面附近放置位置光源)。实时能力也会影响 GI 技术在程序化生成关卡中的适用性。

  • 需要的用户工作量。一些 GI 技术是完全自动化的,而另一些则需要用户精心规划和进行人工操作。根据你的时间预算,某些 GI 技术可能比其他技术更合适。

以下是 Godot 中可用的所有全局光照技术的比较:

性能

按性能从快到慢的顺序:

  • ReflectionProbe:

    • 将 ReflectionProbe 的更新模式设置为 Always 比设置为 Once(默认值)的成本要高得多。集成显卡适合使用 Once 更新模式。在所有渲染器中都可用。

  • LightmapGI:

    • 灯光可以仅烘焙间接光照,也可以按每个灯光为基础完全烘焙以进一步提升性能。还可以使用混合设置(例如用实时方向光搭配完全烘焙的位置光源)。烘焙前启用方向信息可以提升视觉效果,性能损耗较小(代价是文件体积增大)。适用于集成显卡。所有渲染器均可用,但烘焙光照贴图需要支持 RenderingDevice 的硬件。

  • VoxelGI:

    • 可以调整烘焙的细分数量来平衡性能与画质。VoxelGI 的渲染质量可以在项目设置中调整。渲染可选择以半分辨率执行(然后再线性缩放)以显著提高性能。在使用 Mobile 或 Compatibility 渲染器时不可用。

  • 屏幕空间间接光照(SSIL):

    • 可以在项目设置中调整 SSIL 质量和模糊遍数。默认情况下,SSIL 渲染以一半分辨率执行(然后线性缩放)以确保合理的性能水平。在使用 Mobile 或 Compatibility 渲染器时不可用。

  • SDFGI:

    • 可以调整级联的数量以平衡性能和质量。每帧投射的光线数量可以在项目设置中调整。渲染可以选择以半分辨率执行(然后线性缩放)以显著提高性能。在使用 Mobile 或 Compatibility 渲染器时不可用。

视觉效果

为了进行比较,这里展示一个未使用任何全局光照选项的 3D 场景:

未使用任何形式全局光照的 3D 场景(只有恒定的环境光)。靠近相机的盒子和球体都是动态对象。

未使用任何形式全局光照的 3D 场景(只有恒定的环境光)。靠近相机的盒子和球体都是动态对象。

以下是 Godot 的各种全局光照技术的对比:

  • VoxelGI: 中等 反射和间接光照良好,但要注意漏光问题。

    • 由于其基于体素的特性,如果墙壁和地板太薄,VoxelGI 会出现漏光。建议确保所有实体表面的厚度至少与一个体素相当。

      在倾斜表面上也可能出现条纹伪影。在这种情况下,调整偏置属性或旋转 VoxelGI 节点可以帮助缓解这个问题。

      VoxelGI 的实际效果。

      VoxelGI 的实际效果。

  • SDFGI: 中等 反射和间接光照良好,但要注意泄漏和可见的级联偏移。

    • GI 的细节层次(LOD)会根据相机与表面之间的距离而变化。

      通过启用使用遮挡(Use Occlusion)属性可以显著减少泄漏。这会带来小幅度的性能开销,但与 VoxelGI 相比通常会产生更少的漏光。

      当相机快速移动时,可能会看到级联偏移。通过调整级联大小或使用雾可以使这种情况不那么明显。

      SDFGI 的实际效果。

      SDFGI 的实际效果。

  • 屏幕空间间接光照(SSIL): 中等 良好的 次要 间接光照源,但没有反射。

    • SSIL 设计为一种与其他 GI 技术(如 VoxelGI、SDFGI 或 LightmapGI)配合使用的补充方案。SSIL 最适合处理小尺度细节,因为它本身无法为大型结构提供准确的间接光照。在其他 GI技术无法捕捉小尺度细节或动态对象的情况下,SSIL 可以提供实时间接光照。由于其屏幕空间的特性,会产生一些伪影,尤其是当对象进入和离开屏幕时。SSIL 利用上一帧的颜色(后期处理之前)工作,这意味着它包含自发光贴花和自定义着色器(只要它们在屏幕上可见)。

      SSIL 的实际效果(未使用其他 GI 技术)。注意黄色盒子周围的自发光效果。

      SSIL 的实际效果(未使用其他 GI 技术)。注意黄色盒子周围的自发光效果。

  • LightmapGI: 优秀 出色的间接光照,不错的反射(可选)。

    • 这是唯一可以将光线反弹次数提高到 2 次以上(最多 16 次)的技术。启用方向信息后,会使用球谐函数(SH)提供模糊反射效果。

      LightmapGI 的实际效果。此处仅烘焙了间接光照,但也可以烘焙直接光照。

      LightmapGI 的实际效果。此处仅烘焙了间接光照,但也可以烘焙直接光照。

  • ReflectionProbe: 中等 反射良好,但间接光照较差。

    • 间接光照可以禁用、设置为贯穿整个探针的恒定颜色、或者自动从探针的环境中读取(并作为立方体贴图应用)。这本质上充当局部环境光照。反射和间接光照会与其他附近的探针进行混合。

      ReflectionProbe 的实际效果(未使用其他 GI 技术)。注意有反射效果的球体。

      ReflectionProbe 的实际效果(未使用其他 GI 技术)。注意有反射效果的球体。

实时能力

  • VoxelGI: 优秀 完全实时。

    • 间接光照和反射均为完全实时。动态物体不仅可以接收 GI,还能 通过其自发光表面对GI 做出贡献。自定义着色器也可以发出自己的光线,并且会准确地发射出去。

      适用于程序化生成的关卡,前提是提前生成(而非在游玩过程中生成)。烘焙需要几秒钟或更长时间才能完成,但既可以在编辑器中完成,也可以在导出的项目中完成。

  • SDFGI: 中等 半实时。

    • 级联为实时生成,这使得 SDFGI 适用于程序化生成的关卡(包括在游玩过程中生成结构的情况)。

      动态物体可以 接收 GI,但不能 贡献 于它。自发光照明仅在物体进入某个级联时才会更新,因此这对于缓慢移动的物体来说仍可能有效。

  • 屏幕空间间接光照(SSIL): 优秀 完全实时。

    • SSIL 同时适用于静态和动态灯光。它也同时适用于静态和动态遮挡器(包括自发光材质)。

  • LightmapGI: 差 已烘焙,因此不是实时的。

    • 间接光照和 SH 反射均要求烘焙,无法在运行时更改。实时 GI 必须通过其他方式模拟,例如使用实时的位置光源。动态物体通过灯光探针接收间接光照,灯光探针可以自动放置或由用户手动放置(LightmapProbe 节点)。这对于程序化生成的关卡不可行,因为只能从编辑器中烘焙光照贴图。

  • ReflectionProbe: 中等 可选实时。

    • 默认情况下,反射会在探针移动时更新。如果更新模式设置为 始终(开销较大),则会尽可能频繁地更新。

    • 间接光照必须由用户手动配置,但它可以在运行时更改而不会引发后台的大开销计算。这使得 ReflectionProbe 可以用于程序化生成的关卡。

需要的用户工作量

  • VoxelGI: 需要创建一个或多个 VoxelGI 节点并进行烘焙。

    • 为了获得良好的结果,需要正确调整范围。此外,在某些情况下,旋转节点并重新烘焙可以帮助解决泄漏或条纹伪影问题。烘焙速度很快——对于中等复杂度的场景,通常在 10 秒以内。

  • SDFGI: 非常少。

    • SDFGI 是全自动的;只需在环境资源中启用即可。所需的唯一手工操作是正确设置 MeshInstance 的烘焙模式属性。无需创建节点,也不需要烘焙。

  • 屏幕空间间接光照(SSIL): 非常少。

    • SSIL 是全自动的;只需在环境资源中启用即可。无需创建节点,也不需要烘焙。

  • LightmapGI:需要设置 UV2 并烘焙。

    • 静态网格必须重新导入,并启用 UV2 和光照贴图生成。在独立 GPU 上,由于基于 GPU 的光照贴图烘焙,烘焙速度相对较快——对于中等复杂度的场景,通常在 1 分钟以内。

  • ReflectionProbe: 由用户手动放置。

总结

如果你不确定要使用哪种 GI 技术:

  • 对于桌面游戏,最好先从 SDFGI 开始,因为它所需的设置最少。如有需要,之后再切换到其他 GI 技术。为了提高在低端 GPU 和集成显卡上的性能,可以考虑在游戏设置中添加禁用 SDFGI 或 VoxelGI 的选项。SDFGI 可以在环境资源中禁用,VoxelGI 可以通过隐藏 VoxelGI 节点来禁用。为了在高端配置上进一步改善视觉效果,可以在游戏设置中添加启用 SSIL 的选项。

  • 对于移动游戏,LightmapGIReflectionProbe 是唯一受支持的选项。另见 GI 技术的替代方案

参见

你可以使用 全局光照演示项目 比较各种实际的全局光照技术。

我应该在网格和灯光上使用哪种全局光照模式?

无论你使用哪种全局光照技术,都不存在普遍“更好”的全局光照模式。不过,这里有一些关于网格的建议:

  • 对于静态关卡几何体,请使用静态全局光照模式(默认)

  • 对于小型动态几何体和玩家/敌人,请使用禁用全局光照模式。由于小型动态几何体的规模小于一个体素,它们无法贡献显著的间接光照。如果小型动态对象需要间接光照,可以使用挂靠在对象下的 OmniLight3D 或 SpotLight3D 节点进行模拟。

  • 对于大型动态关卡几何体(如移动的火车),请使用动态全局光照模式。请注意,这只对 VoxelGI 生效,因为 SDFGI 和 LightmapGI 不支持动态物体的全局光照。

以下是一些关于光照烘焙模式的建议:

  • 对于静态关卡光照,请使用静态烘焙模式。静态模式也适用于在游戏过程中变化不大的动态灯光,例如闪烁的手电筒。

  • 对于短暂的动态效果(如武器),请使用禁用烘焙模式以提高性能。

  • 对于长期存在的动态效果(如旋转的警示灯),请使用动态烘焙模式以提高质量(默认)。请注意,这只对 VoxelGI 和 SDFGI 生效,因为 LightmapGI 不支持动态灯光的全局光照。

GI 技术的替代方案

如果上述 GI 技术都不适合,仍然可以通过手动放置额外的灯光来模拟 GI。这需要更多的手工工作,但如果操作得当,它可以提供良好的性能以及良好的视觉效果。这种方法至今仍在许多现代游戏中使用。

在面向低端硬件,且无法使用 LightmapGI 的情况下(例如程序化生成的关卡),可能需要单独依靠环境光照或恒定的环境光。这可能会导致视觉效果较为平淡,但调整环境光颜色和天空贡献仍然可以在大多数情况下达成可以接受的效果。