烘焙光照贴图

简介

烘焙的光影图是为场景添加间接(或烘焙)光照的另一种工作流程。与 GI探针 的方法不同,烘焙光照图在低端PC和移动设备上运行良好,因为运行时几乎不消耗资源。

GIProbes 不同的是,Baked Lightmaps[烘焙光照贴图]是完全静态的。一旦被烘焙,就不能被修改,也不能为场景提供反射,所以在内部用 反射探针 和它一起使用(或者在外部使用Sky)是获得好质量的要求。

由于它们是烘焙的,所以比 GIProbe 在光线渗出方面的问题要少,如果在高质量设置下使用Raytrace[光线跟踪]模式,间接光看起来会更好(但烘焙可能需要一段时间)。

最后,决定哪种间接光照方式更好取决于你的使用案例。一般来说,GIProbe看起来更好,而且更容易设置。但对于移动或低端兼容性,Baked Lightmaps是你唯一的选择。

视觉比较

以下是Baked Lightmaps与GIProbe外观的比较。 请注意,光照贴图更准确,但也受到照明在未打开的纹理上的影响,因此过渡和分辨率可能不那么好。 GIProbe看起来不太准确(因为它是近似值),但总体上更加平滑。

../../_images/baked_light_comparison.png

设置

首先,在光照贴图可以执行任何操作之前,要烘焙的对象需要UV2图层和纹理大小。 UV2图层是一组辅助纹理坐标,可确保对象中的任何面在UV贴图中都有自己的位置。 面不得共享纹理中的像素。

这里有几种方法可以确保您的对象具有唯一的UV2层和纹理大小:

从3D DCC展开

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

只需在第二个UV2层上打开包装即可。

../../_images/baked_light_blender.png

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

../../_images/baked_light_lmsize.png

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

从Godot内部解开

Godot可以选择打开网格并可视化UV通道。 它可以在Mesh菜单中找到:

../../_images/baked_light_mesh_menu.png

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

解开场景导入

总体来说,这可能是最好的方法。唯一的缺点是,在大型模型上,导入时解包可能需要一段时间。只要在文件系统栏选择导入的场景,然后进入导入选项卡。在那里,可以修改以下选项:

../../_images/baked_light_import.png

** Light Baking ** 光照烘焙模式需要设置为 "Gen Lightmaps" 。 还必须提供世界单位的纹素大小,因为这将确定光照贴图纹理的最终大小(并因此确定地图中的UV填充)。

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

作为警告:当重用场景中的网格时,请记住将为找到的第一个实例生成UV。 如果网格重复使用不同的比例(并且比例大不相同,超过一半或两次),这将导致低效的光照贴图。 如果您计划使用光照贴图,请不要在不同比例下重复使用源网格。

检查UV2

在前面提到的网格菜单中,可以显示UV2纹理坐标。 如果出现问题,请确保检查网格是否具有以下UV2坐标:

../../_images/baked_light_uvchannel.png

设置场景

在做任何事情之前,需要在场景中添加一个**BakedLightmap** 节点。这将使该场景中的所有节点(和子节点),甚至是实例场景中的所有节点都能进行光照烘焙。

../../_images/baked_light_scene.png

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

配置边界

光线贴图(Lightmap)需要一个受影响区域的近似体积,因为它将光线传递给在该体积内部的动态对象(稍后再谈)。就像使用 GIProbe 一样,用体积覆盖场景:

../../_images/baked_light_bounds.png

设置网格

要使** MeshInstance **节点参与烘焙过程,需要启用``在烘焙灯中使用``属性。

../../_images/baked_light_use.png

在场景导入时自动生成光照贴图时,会自动启用此功能。

设置灯

默认情况下,灯光采用间接灯光烘焙。 这意味着阴影贴图和光照仍然是动态的并影响移动的物体,但是光线反射的光将被烘焙。

灯可以禁用(不烘焙)或完全烘焙(直接和间接)。 这可以通过灯光中的 烘焙模式 菜单进行控制:

../../_images/baked_light_bake_mode.png

模式是:

  • 禁用: 烘焙时忽略灯光。 请记住隐藏灯光对烘焙没有影响,因此必须使用此灯泡。

  • 间接: 这是默认模式。 只会间接照明。

  • 全部: 间接和直接照明都将被烘焙。 如果您不希望灯光出现两次(动态和静态),只需将其隐藏即可。

烘焙质量

为简单起见, 烘焙光照贴图(BakedLightmap) 使用场景的体素化版本来计算光照。 可以使用 烘焙细分(Bake Subdiv) 参数调整体素大小。 更多细分会产生更多细节,但也需要更多时间来烘焙。

通常,默认值足够好。 还有一个 捕捉细分(Capture Subdivision) (必须始终等于或小于主细分),用于捕捉动态对象中的光(稍后会详细介绍)。 对于更多情况,它的默认值也足够好。

../../_images/baked_light_capture.png

除捕获大小外,还可以通过设置 烘焙模式 来修改质量。 提供了两种间接捕获模式:

../../_images/baked_light_mode.png
  • Voxel Cone: Trace:是默认的;它不太精确,但更快。看起来类似于(但比) GIProbe 稍好。

  • 光线追踪(Ray Tracing) :这种方法更精确,但烘焙时间可能要长得多。 如果以低质量或中等质量使用,某些场景可能会产生噪声颗粒。

烘焙

要开始烘焙过程,只需在选择 BakedLightmap 节点时按下顶部的 ** 烘焙光照贴图(Bake Lightmaps )** 大按钮:

../../_images/baked_light_bake.png

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

配置烘焙

烘焙还有几种选择:

  • ** 烘焙细分(Bake Subdiv)** : 光照贴图机(Godot lightmapper)使用网格来传输光信息。 默认值能很好地适用大多数情况。您希望更好地照亮小细节或您的场景很大,可以增大它。

  • ** Capture Subdiv**: 这是用于实时捕获信息的网格(照明动态对象)。 默认值通常是OK,它通常小于Bake Subdiv并且不能大于它。

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

  • 烘焙模式(Bake Mode) :烘焙器可以使用两种不同的技术: 体素圆锥追踪(Voxel Cone Tracing ) (快速但近似),或 光线追踪(RayTracing) (慢但准确)。

  • 传播: 用于*Voxel Cone Trace*模式。工作原理与 GIProbe 中一样。

  • HDR : 如果禁用,则光照贴图更小,但不能捕捉到任何超过白色的光线(1.0)。

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

  • 范围:受影响区域的大小(可以直观地编辑)

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

动态对象

在其他引擎或lightmapper实现中,您需要手动在该级别周围放置称为``lightprobes``的小对象以生成* capture *数据。 然后,这用于将光传输到在场景中移动的动态对象。

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

../../_images/baked_light_indirect.gif