Baked lightmaps

Introducción

Baked lightmaps are an alternative workflow for adding indirect (or fully baked) lighting to a scene. Unlike the Using 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 Reflection Probe together with it on interiors (or using a Sky on exteriors) is a requirement to get good quality.

A medida que se están horneando las texturas (baking), tienen menos problemas que GIProbe con respecto a la purga de la luz, y la luz indirecta a menudo se verá mejor. La desventaja es que hornear mapas de luz lleva mucho más tiempo que hornear una GIProbe. Mientras que hornear una GIProbe se puede hacer en cuestión de segundos, hornear mapas de luz tomará varios minutos, si no más. Esto puede ralentizar significativamente la velocidad de iteración, por lo que se recomienda hornear mapas de luz solo cuando realmente necesite ver cambios en la iluminación.

Los mapas de luz para hornear (baking) también reservarán la ranura UV2 de los materiales horneados, lo que significa que ya no podrá usarlos para otros fines en los materiales (ya sea en el incorporado Material Spatial o en sombreadores personalizados).

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.

Comparaciones visuales

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

Configurando

En primer lugar, antes de que el mapeador de luz pueda hacer algo, los objetos a hornear necesitan una capa de UV2 y un tamaño de textura. Una capa UV2 es un conjunto de coordenadas secundarias de textura que asegura que cualquier cara del objeto tiene su propio lugar en el mapa UV. Las caras no deben compartir píxeles en la textura.

Hay algunas maneras de asegurar que tu objeto tiene una capa de UV2 y un tamaño de textura únicos:

Unwrap al importar escena

Este es probablemente el mejor enfoque en general. El único inconveniente es que, en modelos grandes, el desenvolvimiento puede tardar un poco en la importación. No obstante, Godot guardará en caché la UV2 a través de las reimportaciones, por lo que sólo se regenerará cuando sea necesario.

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).

El efecto de establecer esta opción es que todas las mallas dentro de la escena tendrán sus mapas de UV2 correctamente generados.

Advertencia

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.

Además, los archivos *.unwrap_cache no deben ignorarse en el control de versiones, ya que estos archivos garantizan que las reimportaciones de UV2 sean consistentes en todas las plataformas y versiones del motor.

Desplegar desde Godot

Godot tiene la opción de desplegar mallas y visualizar los canales UV. Se puede encontrar en el menú Malla:

../../_images/baked_light_mesh_menu.png

Esto generará un segundo conjunto de coordenadas UV2 que puede ser usado para hornear, y también fijará el tamaño de la textura automáticamente.

Desplegar desde de su 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.

Simplemente despliegue la segunda capa 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

Si se usan mallas externas en la importación, el tamaño se mantendrá. Tenga cuidado de que la mayoría de los desenvolvedores en los DCC 3D no están orientados a la calidad, ya que están destinados a trabajar rápidamente. La mayoría de las veces necesitarás usar costuras u otras técnicas para crear un mejor desenvolvimiento.

Comprobando el UV2

En el menú de malla mencionado anteriormente, se pueden visualizar las coordenadas de la textura del UV2. Asegúrate, si algo está fallando, de comprobar que las mallas tienen estas coordenadas UV2:

../../_images/baked_light_uvchannel.png

Configurando la escena

Antes de que se haga algo, un nodo de BakedLightmap debe ser añadido a una escena. Esto permitirá que la luz se hornee en todos los nodos (y subnodos) de esa escena, incluso en las escenas instantes.

../../_images/baked_light_scene.png

Se puede instanciar una sub-escena varias veces, ya que esto es apoyado por el baker, y a cada una se le asignará un mapa de luz propio (sólo asegúrese de respetar la regla sobre el escalado mencionada anteriormente):

Configurar los límites

Lightmap necesita un volumen aproximado del área afectada porque lo utiliza para transferir la luz a los objetos dinámicos que se encuentran en su interior (más sobre eso más adelante). Sólo cubre la escena con el volumen como lo haces con GIProbe:

../../_images/baked_light_bounds.png

Configurando mallas

Para que un nodo de MeshInstance participe en el proceso de baking, debe tener activada la propiedad "Use in Baked Light".

../../_images/baked_light_use.png

Cuando se generan automáticamente mapas de luz en la importación de escenas, esto se activa automáticamente.

Configurando luces

Las luces se hornean (bake) con luz indirecta por defecto. Esto significa que los mapas de sombras y la iluminación siguen siendo dinámicos y afectan a los objetos en movimiento, pero la luz que rebota de esa luz será horneada (baked).

Las luces pueden ser desactivadas (sin bake) o totalmente baked (directas e indirectas). Esto se puede controlar desde el menú Bake Mode en las luces:

../../_images/baked_light_bake_mode.png

Los modos son:

Disabled

Disabled: La luz es ignorada en el horneado de mapas de luces. Ten en cuenta que ocultar una luz no tendrá ningún efecto para el baking, así que esto debe ser usado en su lugar.

Este es el modo a utilizar para efectos de iluminación dinámicos como explosiones y efectos de armas.

Indirect

Este es el modo predeterminado, representa un equilibrio entre el rendimiento y la facilidad de uso en tiempo real. Solo se horneará la iluminación indirecta. La luz directa y las sombras siguen siendo en tiempo real, como lo serían sin un BakedLightmap.

Este modo permite realizar cambios sutiles en el color, la energía y la posición de una luz sin dejar de parecer aproximadamente correcta. Por ejemplo, puede usar esto para crear antorchas estáticas parpadeantes que tienen su luz indirecta horneada.

All

Se horneará tanto la iluminación indirecta como la directa. Dado que las superficies estáticas pueden omitir los cálculos de iluminación y sombras por completo, este modo proporciona el mejor rendimiento junto con sombras suaves que nunca se desvanecen según la distancia. La luz en tiempo real ya no afectará a las superficies horneadas, pero seguirá afectando a los objetos dinámicos. Al usar el modo de horneado All en una luz, los objetos dinámicos no proyectarán sombras en tiempo real sobre las superficies horneadas, por lo que debe usar un enfoque diferente, como sombras de manchas. Las sombras de manchas se pueden implementar con una configuración Sprite3D + RayCast, o un SpotLight negativo apuntando hacia abajo con su modo de horneado configurado en Disabled.

La luz no se podrá ajustar durante el juego. Las luces en movimiento o que cambien su color no tendrán ningún efecto sobre las superficies estáticas.

Dado que los modos de horneado se pueden ajustar por luz, es posible crear configuraciones híbridas de luz horneada. Una opción popular es usar un DirectionalLight en tiempo real con su modo de horneado configurado en Indirect, y usar el modo de horneado All para OmniLights y SpotLights. Esto proporciona un buen rendimiento al tiempo que permite que los objetos dinámicos proyecten sombras en tiempo real en áreas al aire libre.

Horneando (Baking)

Para empezar el proceso de horneado, sólo tienes que pulsar el gran botón Hornear mapas de luz en la parte superior al seleccionar el nodo BakedLightmap:

../../_images/baked_light_bake.png

Esto puede llevar de segundos a minutos (u horas) dependiendo del tamaño de la escena, el método de bake y la calidad seleccionada.

Equilibrar los tiempos de horneado (bake) con la calidad

Debido a que el baking de alta calidad pueden llevar mucho tiempo (hasta varias horas para escenas grandes y complejas), se recomienda utilizar ajustes de menor calidad al principio. Luego, una vez que esté seguro con la configuración de iluminación de su escena, aumente la configuración de calidad y realice un horneado "final" antes de exportar su proyecto.

Configurando el bake

Hay varias opciones más para hornear:

  • Bake Extents: el tamaño del área afectada. Esto se puede editar en la ventana gráfica del editor 3D usando las manijas. Cualquier objeto que pueda tener mapas de luz horneados y esté tocando las extensiones de horneado tendrá mapas de luz horneados, pero la captura dinámica de objetos solo funcionará dentro de las extensiones.

Tweaks (ajustes)

  • Calidad: Se proporcionan tres modos de calidad de horneado: Low, Medium, High, Ultra. Una calidad más alta lleva más tiempo, pero da como resultado un mapa de luz de mejor aspecto con menos ruido. La diferencia es especialmente notable con materiales emisores o áreas que reciben poca o ninguna iluminación directa.

  • 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).

Captura

  • 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.

Datos

  • 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.

El recurso Light Data se puede editar para ajustar dos propiedades adicionales:

  • 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.

Truco

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.

Objetos dinámicos

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.

Sin embargo, esta aplicación de la mapeo de luz utiliza un método diferente. El proceso es automático, así que no tienes que hacer nada. Sólo mueve tus objetos alrededor, y se iluminarán en consecuencia. Por supuesto, tienes que asegurarte de establecer los límites de la escena en consecuencia o no funcionará.

../../_images/baked_light_indirect.gif