伪造全局光照

为什么要伪造全局光照?

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

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.