Baked lightmaps

Introducción

Los mapas de luz baked son un flujo de trabajo alternativo para añadir iluminación indirecta (o baked) a una escena. A diferencia del enfoque GI Probes, los mapas de luz baked funcionan bien en PCs y dispositivos móviles de gama baja, ya que casi no consumen recursos en tiempo de ejecución.

A diferencia de los "Giprobe", los Baked Lightmaps son completamente estáticos. Una vez horneados, no pueden ser modificados en absoluto. Tampoco proporcionan reflejos a la escena, así que usar Reflection Probe junto con ella en interiores (o usar un cielo en exteriores) es un requisito para obtener buena calidad.

Al ser horneados, tienen menos problemas que "GIProbe" en cuanto al desteñido ligero, y la luz indirecta puede verse mejor si se usa el modo Raytrace en la configuración de alta calidad (pero hornear puede llevar un tiempo).

Al final, decidir qué enfoque de iluminación indirecta es mejor depende de su caso de uso. En general, el GIProbe se ve mejor y es mucho más fácil de instalar. Sin embargo, para la compatibilidad móvil o de gama baja, los Baked Lightmaps son su única opción.

Comparaciones visuales

Aquí hay algunas comparaciones de cómo se ven los Baked Lightmaps vs. el GIProbe. Noten que los mapas de luz son más precisos, pero también sufren del hecho de que la iluminación está en una textura desenvuelta, así que las transiciones y la resolución pueden no ser tan buenas. El GIProbe parece menos preciso (ya que es una aproximación), pero más suave en general.

../../_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:

Desplegar desde de su 3D DCC

Una opción es hacerlo desde tu aplicación 3D favorita. Este enfoque no es generalmente recomendado, pero se explica primero para que sepas que existe. La principal ventaja es que, en los objetos complejos que se quieran reimportar mucho, el proceso de generación de la textura puede ser bastante costoso dentro de Godot, por lo que tenerlo desenvuelto antes de la importación puede ser más rápido.

Simplemente despliegue la segunda capa UV2.

../../_images/baked_light_blender.png

Y se importan normalmente. Recuerda que tendrás que establecer el tamaño de la textura en la malla después de la importación.

../../_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.

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.

Unwrap al importar escena

Este es probablemente el mejor enfoque en general. La única desventaja es que, en los modelos grandes, el proceso de unwrapping puede llevar un tiempo considerable en la importación. Simplemente selecciona la escena importada en el panel de Sistema de Archivos, luego ve al panel Importar. Allí se puede modificar la siguiente opción:

../../_images/baked_light_import.png

El modo Light Baking debe ser ajustado a "Gen Lightmaps ". También se debe proporcionar un tamaño de texto en unidades mundiales, ya que esto determinará el tamaño final de la textura del mapa de luz (y, en consecuencia, el relleno de UV en el mapa).

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

Como advertencia: Al reutilizar una malla dentro de una escena, toma en cuenta que se generarán UVs para la primera instancia encontrada. Si la malla se reutiliza con diferentes escalas (y las escalas son muy diferentes, más de la mitad o dos veces), esto resultará en mapas de luz ineficientes. Simplemente no reutilices una malla de origen a diferentes escalas si estás planeando usar lightmapping.

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 subescena 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 baked 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 se 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: La luz es ignorada en la cocción. Ten en cuenta que ocultar una luz no tendrá ningún efecto para la baking, así que esto debe ser usado en su lugar.
  • Indirect: Este es el modo por defecto. Sólo se baked la iluminación indirecta.
  • All: Tanto la iluminación indirecta como la directa serán baked. Si no quieres que la luz aparezca dos veces (dinámica y estática), simplemente ocúltala.

Calidad de baking

BakedLightmap uses, for simplicity, a voxelized version of the scene to compute lighting. Voxel size can be adjusted with the Bake Subdiv parameter. More subdivision results in more detail, but also takes more time to bake.

In general, the defaults are good enough. There is also a Capture Subdivision (that must always be equal to or less than the main subdivision), which is used for capturing light in dynamic objects (more on that later). Its default value is also good enough for most cases.

../../_images/baked_light_capture.png

Besides the capture size, quality can be modified by setting the Bake Mode. Two modes of capturing indirect are provided:

../../_images/baked_light_mode.png
  • Voxel Cone: Trace: Is the default one; it's less precise, but faster. Looks similar to (but slightly better than) GIProbe.
  • Ray Tracing: This method is more precise, but can take considerably longer to bake. If used in low or medium quality, some scenes may produce grain.

Baking

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

../../_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.

Configurando el bake

Several more options are present for baking:

  • Bake Subdiv: The Godot lightmapper uses a grid to transfer light information around; the default value is fine and should work for most cases. Increase it in case you want better lighting on small details or your scene is large.
  • Capture Subdiv: This is the grid used for real-time capture information (lighting dynamic objects). Default value is generally OK, it's usually smaller than Bake Subdiv and can't be larger than it.
  • Bake Quality: Three bake quality modes are provided, Low, Medium and High. Higher quality takes more time.
  • Bake Mode: The baker can use two different techniques: Voxel Cone Tracing (fast, but approximate), or RayTracing (slow, but accurate).
  • Propagation: Used for the Voxel Cone Trace mode. Works just like in GIProbe.
  • HDR: If disabled, lightmaps are smaller, but can't capture any light over white (1.0).
  • Image Path: Where lightmaps will be saved. By default, on the same directory as the scene ("."), but can be tweaked.
  • Extents: Size of the area affected (can be edited visually)
  • 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 a bit heavy. If you are using .tscn formats (instead of .scn), you can save it to disk.

Objetos dinámicos

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

However, this implementation of lightmapping uses a different method. The process is automatic, so you don't have to do anything. Just move your objects around, and they will be lit accordingly. Of course, you have to make sure you set up your scene bounds accordingly or it won't work.

../../_images/baked_light_indirect.gif