全局光照简介

什么是全局光照?

全局光照 是一个综合性术语,用于描述一种使用直接光(直接来自光源的光线)和间接光(从表面反射的光线)的照明系统。在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 中可用的所有全局光照技术的比较:

性能

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

  • 反射探针:

    • 更新模式设置为 总是 的反射探针比更新模式设置为 一次**(默认值)的探针贵得多。适用于使用 **一次 更新模式时的集成图形。使用转发移动后端时可用。将在更高版本的兼容性后端中提供。
  • LightmapGI:

    • 灯光可以仅使用间接照明进行烘焙,也可以基于每个灯光进行完全烘焙,以进一步提高性能。 也可以使用混合设置(例如具有实时平行光和完全烘焙的位置光)。 可以在烘焙之前启用方向信息,以较小的性能成本(并且以较大的文件大小为代价)改善视觉效果。 适合集成显卡。 使用 Forward Mobile 后端时可用。 将在以后版本的兼容性后端中提供。
  • VoxelGI:

    • 可以调整烘焙的细分数量以平衡性能和质量。 VoxelGI 渲染质量可以在项目设置中调整。 渲染可以选择以半分辨率执行(然后线性缩放)以显着提高性能。 不可用于 使用 Forward Mobile 或兼容性后端时。
  • 屏幕空间间接照明(Screen-space indirect lighting, SSIL):

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

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

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 进行了烘焙,因此非实时。

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

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

    • 间接光照必须由用户手动配置,但它可以在运行时以一个不会导致后台进行大开销计算的方式更改。这使得 ReflectionProbes 可以用于程序化生成的级别。

用户干预

  • 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 技术的替代方案

参见

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

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

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

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

  • 对于小型动态几何体和玩家/敌人,请使用 禁用 全局光照模式。由于几何体小于体素 ( voxel) ,小的动态几何体将无法提供大量的间接照明。如果小型动态对象需要间接光照,则可以使用对象的父级 OmniLight3D 或 SpotLight3D 节点对其进行模拟。

  • 对于 动态级别的几何体(例如移动的火车),请使用 动态 全局光照模式。请注意,这只对 VoxelGI 有影响,因为 SDFGI 和 LightmapGI 不支持动态对象的全局光照。

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

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

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

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

GI 技术的替代方案

如果上面提到的 GI 技术都不适用,仍然可以通过手动放置附加灯光来模拟 GI。这需要更多的手动操作,但如果做得好,就可以提供良好的性能和视觉效果。这种方法至今仍在许多现代游戏中使用。

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

Previous Next


© 版权所有 2014-present Juan Linietsky, Ariel Manzur and the Godot community (CC BY 3.0). Revision b1c660f7.

Built with Sphinx using a theme provided by Read the Docs.