全局光照简介

什么是全局光照?

全局光照 是一个综合性术语,用于描述一种使用直接光(直接来自光源的光线)和间接光(从表面反射的光线)的照明系统。在3D渲染引擎中,全局光照是实现逼真照明的最重要要素之一。全局光照旨在模拟现实生活中光线的行为,例如光线在表面上反射以及从自发光材料中发出的光线。

在下面的示例中,整个场景由自发光材质(顶部的白色方块)照亮。背面的白色墙壁和天花板在靠近墙壁的地方被染成红色和绿色,因为彩色墙壁上反射的光线正在反射回场景的其余部分。

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

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

间接漫反射光照

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

  • 光*弹跳*在表面上。这种反射光照会与材质的反照率颜色相乘。然后,反射的照明可以被其他表面反射,由于光衰减,影响会减小。在现实生活中,光线会反射无数次。但是出于性能原因,无法在游戏引擎中模拟。相反,退回次数通常限制为 1 或 2(烘焙光照贴图时最多限制为 16)。更多的反弹将导致阴影区域更真实的光线衰减,而代价是导致性能较低或烘烤时间更长。

  • 自发光材质还可以发出可以在表面上反弹的光。这充当 区域照明 的一种形式。与使用 OmniLight3D 或 SpotLight3D 节点发光不同,确定大小的区域将使用自己的表面发光。

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

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

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

备注

间接漫反射照明可能是没有细节纹理的场景中色带的来源。这导致光线梯度不平滑,而是具有可见的“步进”效果。减少这种效果的方法见 带状颜色 部分。

镜面反射光效果

镜面反射照明也被称为 反射 。这是根据摄像机角度而变化强度的照明。这种镜面照明可以是 直接间接

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

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

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

在确定要使用全局光照(GI)技术时,需要记住以下几个准则:

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

  • 视觉效果。 除了不能达到最佳效果外,实时 GI 技术通常不能提供最佳的视觉输出。尤其是在大多数静态场景中,其中实时 GI 的动态特性不容易被注意到。如果你的目标是最大限度地提高视觉质量,那么烘焙技术通常会看起来更好,并且会减少漏光。

  • 实时能力。 一些 GI 技术是完全实时的,而其他技术只是半实时的或根本不是实时的。半实时技术有完全实时技术没有的限制。例如,动态对象可能不会为场景提供自发光照明。非实时技术不支持任何形式的动态 GI ,因此如果需要,必须使用其他技术进行伪造(例如在发射表面附近放置定位灯)。实时能力也会影响 GI 技术在程序化生成关卡上的可行性。

  • 需要用户工作。 一些 GI 技术是完全自动的,而另一些则需要用户仔细规划和手动操作。根据你的时间预算,某些 GI 技术可能比其他技术更可取。

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

性能

按照性能从最快到最慢的顺序:

  • 反射探针:

    • ReflectionProbes with their update mode set to Always are much more expensive than probes with their update mode set to Once (the default). Suited for integrated graphics when using the Once update mode. Available in all renderers.

  • LightmapGI:

    • Lights can be baked with indirect lighting only, or fully baked on a per-light basis to further improve performance. Hybrid setups can be used (such as having a real-time directional light and fully baked positional lights). Directional information can be enabled before baking to improve visuals at a small performance cost (and at the cost of larger file sizes). Suited for integrated graphics. Available in all renderers. However, baking lightmaps requires hardware with RenderingDevice support.

  • VoxelGI:

    • The bake's number of subdivisions can be adjusted to balance between performance and quality. The VoxelGI rendering quality can be adjusted in the Project Settings. The rendering can optionally be performed at half resolution (and then linearly scaled) to improve performance significantly. Not available when using the Mobile or Compatibility renderers.

  • 屏幕空间间接照明(Screen-space indirect lighting, SSIL):

    • The SSIL quality and number of blur passes can be adjusted in the Project Settings. By default, SSIL rendering is performed at half resolution (and then linearly scaled) to ensure a reasonable performance level. Not available when using the Mobile or Compatibility renderers.

  • SDFGI:

    • The number of cascades can be adjusted to balance performance and quality. The number of rays thrown per frame can be adjusted in the Project Settings. The rendering can optionally be performed at half resolution (and then linearly scaled) to improve performance significantly. Not available when using the Mobile or Compatibility renderers.

Visuals

为了进行比较,这里有一个未使用全局照明选项的 3D 场景:

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

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

以下是 Godot 的各种全局照明技术的比较:

  • VoxelGI: average 良好的反射和间接照明,但要小心泄漏。

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

      在倾斜的表面上也可能会看到条纹伪影(streaking artifacts)。 在这种情况下,调整偏置属性或旋转 VoxelGI 节点可以对解决这个问题有帮助。

      VoxelGI 的实际应用。

      VoxelGI 的实际应用。

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

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

      通过启用 使用遮挡(Use Occlusion) 属性可以显着减少泄漏。 这具有较小的性能成本,但与 VoxelGI 相比,它通常会导致更少的泄漏。

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

      SDFGI 的实际应用。

      SDFGI 的实际应用。

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

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

      SSIL 的实际应用(没有任何其他 GI 技术)。 注意黄色盒子周围的自发光。

      SSIL 的实际应用(没有任何其他 GI 技术)。 注意黄色盒子周围的自发光。

  • LightmapGI: good 出色的间接照明,良好的反射(可选)。

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

      LightmapGI 的实际应用。 这里只烘焙间接光照,但也可以烘焙直接光照。

      LightmapGI 的实际应用。 这里只烘焙间接光照,但也可以烘焙直接光照。

  • ReflectionProbe: average 反射良好,但间接照明较差。

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

      ReflectionProbe 的实际应用(没有任何其他 GI 技术)。 注意有反射效果球体。

      ReflectionProbe 的实际应用(没有任何其他 GI 技术)。 注意有反射效果球体。

实时能力

  • VoxelGI: good 完全实时。

    • 间接关照和反射是完全实时的。动态物体可以接收 GI, 通过其自发光表面对 GI 做出贡献。自定义着色器也可以准确地发出自己的光。

      适用于程序生成的关卡 如果它们是提前生成的 (而不是在游戏过程中)。 烘焙需要几秒钟或更长时间才能完成,但可以从编辑器和导出的项目中完成。

  • SDFGI:average 半实时。

    • 级联(Cascade)是实时生成的,使得 SDFGI 适用于程序生成的关卡(包括在游戏过程中生成结构时)。

      动态对象可以 接收 GI,但不能 贡献 它。 自发光光线仅在对象进入级联时才会更新,因此它可能仍然适用于缓慢移动的对象。

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

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

  • LightmapGI:bad 进行了烘焙,因此非实时。

    • Both indirect lighting and SH reflections are baked and can't be changed at runtime. Real-time GI must be simulated via other means, such as real-time positional lights. Dynamic objects receive indirect lighting via light probes, which can be placed automatically or manually by the user (LightmapProbe node). Not viable for procedurally generated levels, as baking lightmaps is only possible from the editor.

  • ReflectionProbe:average 可选实时。

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

    • Indirect lighting must be configured manually by the user, but can be changed at runtime without causing an expensive computation to happen behind the scenes. This makes ReflectionProbes viable for procedurally generated levels.

用户干预

  • VoxelGI:需要创建若干 VoxelGI 节点并烘焙。

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

  • SDFGI:非常少。

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

  • 屏幕空间间接光照(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无效的情况下(例如程序生成的表面)或者配置的硬件较低,可能需要单独依靠环境照明或稳定的环境光。这可能会导致没有凹凸感的视觉效果,但调整环境光的颜色和天空贴图后仍然可以在大多数情况下能接受的效果。