Up to date

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

伪造全局光照

为什么要伪造全局光照?

Godot 提供了多种全局照明 (GI) 技术,各有其优点和缺点。 尽管如此,仍然可以避免使用任何 GI 技术并使用手工制作的方法。 使用“手工”方法进行全局照明而不是 VoxelGI、SDFGI 或烘焙光照贴图,有几个原因:

  • 你需要具有良好的渲染性能,但无法承受潜在的繁琐的光照贴图烘焙过程。

  • 你需要一种完全实时 可在程序生成的关卡中工作的 GI 方法。

  • 你需要一种完全实时的 GI 方法 并且 不会出现明显的漏光问题。

下面描述的方法仅涵盖间接漫反射照明,而不涵盖镜面反射照明。 对于镜面反射照明,请考虑使用 ReflectionProbes,它通常足够便宜,且可以与这种假 GI 方法结合使用。

参见

不确定用灯光伪造全局照明是否适合你的需求? 请参阅 我应该使用哪种全局光照技术? 以了解 Godot 4 中可用的 GI 技术的比较。

伪造 DirectionalLight3D 的全局光照

虽然天空会提供自己的定向照明,但场景的主要 DirectionalLight3D 节点通常会发出大量的光。 当使用 GI 技术时,这种光会在固体表面上反射,并会在大多数户外阴影表面上反射回来。

我们可以通过添加第二个 DirectionalLight3D 节点来伪造这一点,并进行以下更改:

  • 将灯光旋转 180 度。 这使得它能够表现由主 DirectionalLight3D 节点反射的光照。

  • 阴影(Shadows) 设置为 关闭 。这减少了辅助光源的性能负担,同时也允许阴影区域接收 一些 光照(这正是我们想要的)。

  • 能量(Energy) 设置为原始值的 10-40% 。没有 "完美的" 值,所以请根据光线和你特有的材质颜色,尝试各种能量值。

  • 镜面反射(Specular) 设置为 0.0 。间接光照不应发出可见的镜面反射波瓣,因此我们需要完全禁用辅助光的镜面反射光照。

备注

这种方法最适合大多数户外场景。 当进入室内时,辅助 DirectionalLight3D 的灯光仍然可见,因为该灯光禁用了阴影。

这可以通过在进入室内区域时,平滑地减少辅助 DirectionalLight3D 的能量(并在离开室内区域时执行相反的操作)来解决。 例如,可以使用 Area3D 节点和 AnimationPlayer 来实现。

伪造位置灯光的全局光照

对于位置光源(OmniLight3D 和 SpotLight3D),可以采用与 DirectionalLight3D 相同的方法。 然而,这将需要更多的手动处理,因为该方法需要对场景中的每个位置光照节点重复此操作,才能让效果看起来不错。

在理想情况下,应在大量光线照射到足够明亮表面的每个位置,都添加额外的 OmniLight3D。 然而,由于时间限制,这个设想并不总是容易实现(特别是在执行程序关卡生成时)。

如果你赶时间,可以将辅助 OmniLight3D 节点放置在与主 OmniLight3D 节点相同的位置。 你可以将此节点添加为主 OmniLight3D 节点的子节点,以便轻松同时移动和隐藏这两个节点。

在辅助 OmniLight3D 节点上执行以下修改:

  • 将灯光的 范围 提高25-50%。这使辅助光能够照亮原先的光线所未照亮的区域。

  • 阴影(Shadows) 设置为 关闭 。这减少了辅助光源的性能负担,同时也允许阴影区域接收 一些 光照(这正是我们想要的)。

  • 能量 设置为原先值的 10-40%。不存在“完美”值,因此请根据光线及其周围环境尝试各种能量值。

  • 镜面反射 设置为0。间接照明不应发出可见的镜面光波瓣(lobe),因此我们需要完全禁用辅助光的镜面照明。

对于 SpotLight3D,可以使用相同的技巧。 在这种情况下,辅助 OmniLight3D 的放置方式应能够反射 大多数 光线将被反射的位置。 这通常是靠近 SpotLight3D 的主要影响位置。

在下面的示例中,SpotLight3D 节点用于照亮房间的地板。 然而,由于没有间接照明,房间的其余部分仍然完全黑暗。 在现实生活中,房间的墙壁和天花板会被周围反射的光照亮。 使用位于 SpotLight3D 的原点和地板之间的 OmniLight3D 节点可以模拟此效果:

../../../_images/faking_global_illumination_comparison.webp