伪造全局光照
为什么要伪造全局光照?
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 节点可以模拟此效果: