烘焙光照贴图

简介

Baked lightmaps are an alternative workflow for adding indirect (or fully baked) lighting to a scene. Unlike the 使用全局光照探测器GIProbe approach, baked lightmaps work fine on low-end PCs and mobile devices, as they consume almost no resources at run-time. Also unlike GIProbe, baked lightmaps can optionally be used to store direct lighting, which provides even further performance gains.

Unlike GIProbes, Baked Lightmaps are completely static. Once baked, they can't be modified at all. They also don't provide the scene with reflections, so using 反射探针 together with it on interiors (or using a Sky on exteriors) is a requirement to get good quality.

As they are baked, they have fewer problems than GIProbe regarding light bleeding, and indirect light will often look better. The downside is that baking lightmaps takes much longer than baking a GIProbe. While baking a GIProbe can be done in a matter of seconds, baking lightmaps will take several minutes if not more. This can slow down iteration speed significantly, so it is recommended to bake lightmaps only when you actually need to see changes in lighting.

Baking lightmaps will also reserve baked materials' UV2 slot, which means you can no longer use it for other purposes in materials (either in the built-in 空间材质 or in custom shaders).

In the end, deciding which indirect lighting approach is better depends on your use case. In general, GIProbe is easier to set up and works better with dynamic objects. For mobile or low-end compatibility, though, baked lightmaps are your only choice.

视觉比较

Here are some comparisons of how BakedLightmap vs. GIProbe look. Notice that lightmaps are more accurate, but also suffer from the fact that lighting is on an unwrapped texture, so transitions and resolution may not be that good. GIProbe looks less accurate (as it's an approximation), but smoother overall.

../../_images/baked_light_comparison.png

设置

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

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

解开场景导入

This is probably the best approach overall. The only downside is that, on large models, unwrapping can take a while on import. Nonetheless, Godot will cache the UV2 across reimports, so it will only be regenerated when needed.

Select the imported scene in the filesystem dock, then go to the Import dock. There, the following option can be modified:

../../_images/baked_light_import.png

The Light Baking mode needs to be set to Gen Lightmaps. A texel size in world units must also be provided, as this will determine the final size of the lightmap texture (and, in consequence, the UV padding in the map).

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

警告

When reusing a mesh within a scene, keep in mind that UVs will be generated for the first instance found. If the mesh is re-used with different scales (and the scales are wildly different, more than half or twice), this will result in inefficient lightmaps. Don't reuse a source mesh at significantly different scales if you are planning to use lightmapping.

Also, the *.unwrap_cache files should not be ignored in version control as these files guarantee that UV2 reimports are consistent across platforms and engine versions.

从Godot内部解开

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

../../_images/baked_light_mesh_menu.png

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

从3D DCC展开

The last option is to do it from your favorite 3D app. This approach is generally not recommended, but it's explained first so that you know it exists. The main advantage is that, on complex objects that you may want to re-import a lot, the texture generation process can be quite costly within Godot, so having it unwrapped before import can be faster.

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

../../_images/baked_light_blender.png

Then import the 3D scene normally. Remember you will need to set the texture size on the mesh after import.

../../_images/baked_light_lmsize.png

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

检查UV2

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

../../_images/baked_light_uvchannel.png

设置场景

Before anything is done, a BakedLightmap node needs to be added to a scene. This will enable light baking on all nodes (and sub-nodes) in that scene, even on instanced scenes.

../../_images/baked_light_scene.png

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

配置边界

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

../../_images/baked_light_bounds.png

设置网格

For a MeshInstance node to take part in the baking process, it needs to have the Use in Baked Light property enabled.

../../_images/baked_light_use.png

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

设置灯

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

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

../../_images/baked_light_bake_mode.png

模式是:

Disabled

The light is ignored when baking lightmaps. Keep in mind hiding a light will have no effect for baking, so this must be used instead of hiding the Light node.

This is the mode to use for dynamic lighting effects such as explosions and weapon effects.

Indirect

This is the default mode, and is a compromise between performance and real-time friendliness. Only indirect lighting will be baked. Direct light and shadows are still real-time, as they would be without BakedLightmap.

This mode allows performing subtle changes to a light's color, energy and position while still looking fairly correct. For example, you can use this to create flickering static torches that have their indirect light baked.

All

Both indirect and direct lighting will be baked. Since static surfaces can skip lighting and shadow computations entirely, this mode provides the best performance along with smooth shadows that never fade based on distance. The real-time light will not affect baked surfaces anymore, but it will still affect dynamic objects. When using the All bake mode on a light, dynamic objects will not cast real-time shadows onto baked surfaces, so you need to use a different approach such as blob shadows instead. Blob shadows can be implemented with a Sprite3D + RayCast setup, or a negative SpotLight pointing down with its bake mode set to Disabled.

The light will not be adjustable at all during gameplay; moving it and changing its color will not have any effect on static surfaces.

Since bake modes can be adjusted on a per-light basis, it is possible to create hybrid baked light setups. One popular option is to use a real-time DirectionalLight with its bake mode set to Indirect, and use the All bake mode for OmniLights and SpotLights. This provides good performance while still allowing dynamic objects to cast real-time shadows in outdoor areas.

烘焙

To begin the bake process, just push the Bake Lightmaps button on top when selecting the BakedLightmap node:

../../_images/baked_light_bake.png

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

Balancing bake times with quality

Since high-quality bakes can take very long (up to several hours for large complex scenes), it is recommended to use lower quality settings at first. Then, once you are confident with your scene's lighting setup, raise the quality settings and perform a "final" bake before exporting your project.

配置烘焙

烘焙还有几种选择:

  • Bake Extents: The size of the area affected. This can be edited in the 3D editor viewport using the handles. Any object that can have lightmaps baked and is touching the bake extents will have lightmaps baked for it, but dynamic object capture will only work within the extents.

Tweaks

  • Quality: Three bake quality modes are provided: Low, Medium, High, and Ultra. Higher quality takes more time, but result in a better-looking lightmap with less noise. The difference is especially noticeable with emissive materials or areas that get little to no direct lighting.

  • Bounces: The number of bounces to use for indirect lighting. The default value (3) is a good compromise between bake times and quality. Higher values will make light bounce around more times before it stops, which makes indirect lighting look smoother (but also brighter). During the initial lighting iteration work, it is recommended to decrease the number of bounces to 1 to speed up baking. Remember that your scene will be darker when decreasing the number of bounces.

  • Use Denoiser: If enabled, uses OpenImageDenoise to make the lightmap significantly less noisy. This increases bake times and can occasionally introduce artifacts, but the result is often worth it.

  • Use Hdr: If disabled, lightmaps are smaller on disk, but they won't be able to capture any light over white (1.0). This will result in visible clipping if you have bright lights in your scene. When HDR is disabled, banding may also be visible in the lightmap.

  • Use Color: If disabled, lightmaps are smaller on disk, but the lightmap won't be able to store colored lighting. When baking indirect light only, the difference may be barely visible since indirect light is generally not highly saturated. However, when baking both direct and indirect lighting using the All bake mode on a light, this will turn colored lighting into grayscale lighting. This can be disabled together with HDR to get the smallest possible lightmap file at a given resolution.

  • Bias: The offset value to use for shadows in 3D units. You generally don't need to change this value, except if you run into issues with light bleeding or dark spots in your lightmap after baking. This setting does not affect real-time shadows casted on baked surfaces.

  • Default Texels Per Unit: For meshes that do not specify their own lightmap texel density, this will be used as the value. Higher values result in lower-resolution lightmaps, which result in faster bake times and lower file sizes at the cost of blurrier indirect lighting and shadows.

Atlas

  • Generate: If enabled, a texture atlas will be generated for the lightmap. This results in more efficient rendering, but is only compatible with the GLES3 rendering backend. Disable this setting if your project is allowed to fall back to GLES2. (This is not the case by default and must be enabled in the Project Settings.) This setting is ignored when the project is configured to use GLES2 by default.

  • Max Size: The maximum size of the atlas in pixels. Higher values result in a more efficient atlas, but are less compatible with old/low-end hardware. If in doubt, leave this setting on its default value (4096).

捕获

  • Enabled: This enables probe capture so that dynamic objects can receive indirect lighting. Regardless of this setting's value, dynamic objects will not be able to contribute indirect lighting to the scene. This is a limitation of lightmaps.

  • Cell Size: The distance between lightmap probes in 3D units. Higher values result in more sparse probe placement, which decreases bake times and file size at the cost of lower lighting accuracy for dynamic objects.

  • Quality: The lightmap probe generation quality. Higher values result in more accurate lighting, but take longer to bake. This setting does not affect the density of the lightmap probes, only their quality.

  • Propagation: Similar to GIProbe's Propagation property. Higher values result in brighter and more diffuse indirect lighting for dynamic objects. Adjust this value depending on your scene to make dynamic objects better fit with static baked lighting.

数据

  • Light Data: Contains the light baked data after baking. Textures are saved to disk, but this also contains the capture data for dynamic objects, which can be heavy. If you are using a scene in .tscn format, you should save this resource to an external binary .lmbake file to avoid bloating the .tscn scene with binary data encoded in Base64.

The Light Data resource can be edited to adjust two additional properties:

  • Energy: Adjusts the lightmap's brightness. Higher values result in brighter lightmaps. This can be adjusted at run-time for short-lived dynamic effects such as thunderstorms. However, keep in mind that it will affect all baked lights.

  • Interior: If enabled, dynamic objects will not make use of environment lighting and will use light probes for ambient lighting exclusively. If disabled, both environment lighting and light probes are used to light up dynamic objects.

小技巧

The generated EXR file can be viewed and even edited using an image editor to perform post-processing if needed. However, keep in mind that changes to the EXR file will be lost when baking lightmaps again.

动态对象

In other engines or lightmapper implementations, you are generally required to manually place small objects called "lightprobes" all around the level to generate capture data. This is then used to transfer the light to dynamic objects that move around the scene.

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

../../_images/baked_light_indirect.gif