烘焙光照图

介绍

烘焙光照贴图是向场景添加间接(或烘焙)照明的可选工作流。不同于 GI探针 这种方法,烘焙的光照图在低端PC和移动设备上很好地工作,因为它们在运行时几乎不消耗任何资源。

不像 GIProbe S,烘焙的光照图是完全静态的。一旦烘焙,它们就不能再被修改了。它们也不为场景提供反射,因此使用 反射探头 再加上它的内部(或使用天空的外部)是一个要求,以获得良好的质量。

当它们被烘烤时,它们的问题比 GIProbe 对于光出血,如果在高质量设置下使用光线跟踪模式,间接光看起来会更好(但烘焙可能需要一段时间)。

最后,决定哪种间接照明方法更好取决于您的用例。一般来说,giprobe看起来更好,而且更容易设置。但是,对于移动或低端兼容性,烘焙光照图是您的唯一选择。

目视比较

以下是烘焙光照图与giprobe的对比。请注意,光照贴图更精确,但同时也会受到光照在未展开纹理上这一事实的影响,因此过渡和分辨率可能不太好。giprobe看起来不太准确(因为它是一个近似值),但总体上更平滑。

../../_images/baked_light_comparison.png

设置

首先,在LightMapper可以做任何事情之前,要烘焙的对象需要一个uv2层和一个纹理大小。UV2层是一组辅助纹理坐标,确保对象中的任何面在UV贴图中都有自己的位置。面不能在纹理中共享像素。

有几种方法可以确保对象具有独特的UV2层和纹理大小:

从3D DCC中展开

一种选择是从你最喜欢的3D应用程序中完成。通常不建议使用这种方法,但首先对其进行解释,以便您知道它的存在。主要的优点是,在复杂的对象上,你可能需要重新导入很多,纹理生成过程在Godot中可能会非常昂贵,所以在导入之前打开它可以更快。

只需在第二个UV2层上展开即可。

../../_images/baked_light_blender.png

正常导入。记住,导入后需要在网格上设置纹理大小。

../../_images/baked_light_lmsize.png

如果在导入时使用外部网格,则大小将保持不变。请注意,3D DCC中的大多数展开器都不是面向质量的,因为它们的工作速度很快。您将主要需要使用接缝或其他技术来创建更好的展开。

从Godot内部展开

Godot有一个打开网格和可视化UV通道的选项。可以在“网格”菜单中找到:

../../_images/baked_light_mesh_menu.png

这将生成第二组可用于烘焙的uv2坐标,它还将自动设置纹理大小。

打开场景导入

这可能是最好的方法。唯一的缺点是,在大型模型上,拆解可能需要一段时间才能导入。只需在文件系统基座中选择导入的场景,然后转到导入选项卡。在这里,可以修改以下选项:

../../_images/baked_light_import.png

这个 光烘烤 模式需要设置为 “通用光照图” . 还必须提供以世界单位表示的texel大小,因为这将决定光照贴图纹理的最终大小(因此,还会决定地图中的UV填充)。

设置此选项的效果是,场景中的所有网格都将正确生成其UV2贴图。

作为警告:在场景中重用网格时,请记住将为找到的第一个实例生成UV。如果网格在不同的比例下被重复使用(并且比例相差很大,超过一半或两倍),这将导致无效的光照图。如果你打算使用光照映射,就不要在不同的尺度上重用源网格。

检查UV2

在前面提到的“网格”菜单中,可以可视化UV2纹理坐标。如果出现故障,请确保检查网格是否具有这些UV2坐标:

../../_images/baked_light_uvchannel.png

设置场景

在做任何事情之前, BakedLightmap 需要将节点添加到场景中。这将在该场景中的所有节点(和子节点)上启用灯光烘焙,即使在实例场景中也是如此。

../../_images/baked_light_scene.png

一个子场景可以被多次实例化,因为这是由Baker支持的,并且每个场景都将被分配一个自己的光照图(只需确保遵守前面提到的缩放规则):

配置边界

光照贴图需要一个受影响区域的近似体积,因为它使用它将光传递到其内部的动态对象(稍后将详细介绍)。就像你用音量覆盖场景一样 GIProbe

../../_images/baked_light_bounds.png

设置网格

对于一个 MeshInstance 节点要参与烘焙过程,需要启用“在烘焙灯光中使用”属性。

../../_images/baked_light_use.png

在场景导入时自动生成光照贴图时,将自动启用该选项。

设置灯光

默认情况下,使用间接灯光烘焙灯光。这意味着阴影映射和灯光仍然是动态的,并且会影响移动的对象,但光线从该灯光反弹将被烘焙。

灯光可以禁用(不烘焙)或完全烘焙(直接和间接)。这可以从 烘焙模式 灯光菜单:

../../_images/baked_light_bake_mode.png

模式包括:

  • 禁用: 烘焙时忽略灯光。请记住,隐藏灯光不会对烘焙产生影响,因此必须使用此选项。

  • 间接: 这是默认模式。只有间接照明将被烘焙。

  • All: 将烘焙间接和直接照明。如果不希望灯光出现两次(动态和静态),只需隐藏它。

烘烤质量

BakedLightmap 为了简单起见,使用场景的体素化版本来计算照明。体素大小可以通过 烘焙细分曲面 参数。更多的细分会产生更多的细节,但也需要更多的时间来烘焙。

一般来说,违约已经足够好了。还有一个 捕获细分 (必须始终等于或小于主细分),用于捕捉动态对象中的光(稍后将详细介绍)。它的默认值对于大多数情况也足够好。

../../_images/baked_light_capture.png

除了捕获大小外,还可以通过设置 烘焙模式 . 提供了两种间接捕获模式:

../../_images/baked_light_mode.png
  • 体素锥 :trace:是默认值;精度较低,但速度较快。看起来像(但比) GIProbe .

  • 光线跟踪 :此方法更精确,但烘焙时间可能会更长。如果用在低或中等质量,有些场景可能会产生谷物。

烘烤

要开始烘焙过程,只需推大 烘焙光照贴图 当选择 BakedLightmap 节点:

../../_images/baked_light_bake.png

这可能需要几秒到几分钟(或几小时),具体取决于场景大小、烘焙方法和选定的质量。

配置烘焙

还有几个烘焙选项:

  • 烘焙细分曲面 :godot lightmapper使用网格传输周围的灯光信息;默认值很好,大多数情况下都可以使用。增加它,以防你想要更好的照明在小细节或你的场景是大。

  • 捕获细分曲面 :这是用于实时捕获信息(照明动态对象)的网格。默认值通常是OK,它通常小于烘焙细分曲面,不能大于它。

  • 烘烤质量 :提供三种烘焙质量模式:低、中、高。更高的质量需要更多的时间。

  • 烘焙模式 :面包师可以使用两种不同的技术: 体素锥体跟踪 (快速,但近似),或 RayTracing (缓慢但准确)。

  • 传播 :用于 体素锥跟踪 模式。工作就像在 GIProbe .

  • HDR :如果禁用,则光照贴图较小,但无法捕获任何白色(1.0)上的光。

  • 图像路径 :保存光照图的位置。默认情况下,与场景(“.”)在同一目录下,但可以进行调整。

  • 范围 :受影响区域的大小(可视化编辑)

  • 灯光数据 :包含烘焙后的光烘焙数据。纹理保存到磁盘,但这也包含动态对象的捕获数据,可能有点重。如果您使用的是.tscn格式(而不是.scn),则可以将其保存到磁盘。

动态对象

在其他引擎或lightmapper实现中,需要手动将称为“lightprobe”的小对象放在级别周围以生成 捕获 数据。这用于将灯光传输到在场景中移动的动态对象。

但是,LightMapping的这种实现使用了不同的方法。这个过程是自动的,所以你不需要做任何事情。只要移动你的物体,它们就会相应地被点亮。当然,你必须确保你设置了相应的场景边界,否则它将不起作用。

../../_images/baked_light_indirect.gif