Horneo de mapas de luces

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 Usando GIProbe, 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. Además, a diferencia de GIProbe, los mapas de luz baked se pueden utilizar opcionalmente para almacenar iluminación directa, lo que proporciona aún más mejoras de rendimiento.

A diferencia de los GIProbes, los Baked Lightmaps (mapas de luces baked) son completamente estáticos. Una vez creados, 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 Sky en exteriores) es un requisito para obtener buena calidad.

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

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:

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.

Seleccione la escena importada en el panel del sistema de archivos, luego vaya 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 texel en unidades del mundo, ya que esto determinará el tamaño final de la textura del mapa de luz (y, en consecuencia, el relleno 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.

Advertencia

Como advertencia: Al reutilizar una malla dentro de una escena, tenga 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.

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

La última opción es hacerlo desde tu aplicación 3D favorita. Este enfoque generalmente no se recomienda, pero se explica primero para que sepa que existe. La principal ventaja es que, en objetos complejos que es posible que desee volver a importar mucho, el proceso de generación de texturas puede ser bastante costoso dentro de Godot, por lo que desenvolverlo antes de la importación puede ser más rápido.

Simplemente despliegue la segunda capa UV2.

../../_images/baked_light_blender.png

Luego importe la escena 3D normalmente. Recuerde que necesitará 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.

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:

Deshabilitado

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.

Indirecto

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.

Todo

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.

Después de seleccionar el modo de cocción All en una luz, opcionalmente puedes especificar un Size mayor que 0 para la luz en el inspector. Este tamaño se utiliza para proporcionar sombras más suaves según la distancia entre el objeto que proyecta la sombra y el objeto que la recibe. Esto imita la apariencia de las sombras en la vida real:

../../_images/baked_light_omnilight_size.png

La propiedad Size de la luz se ignora para las sombras en tiempo real; solo afectará a las sombras horneadas. Cuando se cambia la propiedad Size, es necesario volver a hornear los lightmaps para que los cambios sean visibles.

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.

Nota

De forma predeterminada, el generador de mapas de luz utilizará todos los núcleos lógicos de la CPU del sistema para acelerar el proceso de generación. Esto puede reducir la capacidad de respuesta del sistema. Para preservar la capacidad de respuesta del sistema mientras se generan los mapas de luz, puedes reducir el número de hilos de la CPU utilizados para la generación. Mantener libres de 1 a 2 hilos de la CPU ayudará a mejorar la capacidad de respuesta del sistema, lo cual es útil cuando se realiza multitarea mientras se generan los mapas de luz, a costa de una ligera ralentización en la generación de los mapas.

Para hacerlo, abre Editor > Configuración del editor y ajusta Editores > 3D > Número de hilos de la CPU para generación de mapas de luz. El valor predeterminado (0) utiliza todos los núcleos lógicos de la CPU del sistema. Los valores positivos especificarán la cantidad de hilos a utilizar, mientras que los valores negativos restarán del total de núcleos lógicos de la CPU del sistema. Por ejemplo, en un sistema con 8 núcleos lógicos de CPU, ajustar la configuración a -1 utilizará 7 hilos de la CPU para la generación de mapas de luz.

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 cuatro 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 La cantidad de bounces que se utilizarán para la iluminación indirecta. El valor predeterminado (3) es un buen compromiso entre los tiempos de creación y la calidad. Los valores más altos harán que la luz rebote más veces antes de detenerse, lo que hace que la iluminación indirecta parezca más suave (pero también más brillante). Durante el trabajo de iteración de iluminación inicial, se recomienda disminuir el número de bounces a 1 para acelerar la creación. Recuerda que tu escena será más oscura al disminuir el número de bounces.

  • Use Denoiser: Si está habilitado, usa OpenImageDenoise para hacer que el mapa de luz sea significativamente menos ruidoso. Esto aumenta los tiempos de creación y ocasionalmente puede introducir artefactos, pero el resultado a menudo vale la pena.

  • Use Hdr: Si está deshabilitado, los lightmaps son más pequeños en el disco, pero no podrán capturar ninguna luz sobre el blanco (1.0). Esto resultará en un recorte visible si tiene luces brillantes en su escena. Cuando HDR está desactivado, las bandas también pueden ser visibles en el lightmap.

  • Usar Color: Si se desactiva, los lightmaps ocuparán menos espacio en el disco, pero el lightmap no podrá almacenar el color de la luz. Cuando se hace baking exclusivamente de la luz indirecta, la diferencia podría no ser apenas visible debido a que la luz indirecta es generalmente poco saturada. Sin embargo, cuando se bakea la luz directa e indirecta usando el modo de bake Todo, los colores de la luz se convertirán a escala de grises. Se puede desactivar junto al HDR para generar el menor tamaño de archivo posible para un lightmap de una misma resolución.

  • Bias: El valor de offset a usar para las sombras en unidades 3D. Generalmente no necesitas cambiar este valor, excepto que te estés encontrando con problemas de sangrado de luz o manchas negras en tu lightmap después de hacer un bake. Esta opción no afecta a las sombras emitidas en tiempo real en superficies con bake.

  • Texels por unidad predeterminado: Para mallas que no especifican su propia densidad de texels, usarán este valor como el suyo propio. Mayores valores darán como resultado lightmaps de menor resolución, lo cual puede resultar en mejores tiempos de bake y menores tamaños de archivos al coste de que la luz indirecta y las sombras estén más difuminadas.

Atlas

  • Generar: Si está habilitado, se generará un atlas de texturas para el mapa de luz. Esto da como resultado un renderizado más eficiente, pero solo es compatible con el backend de renderizado GLES3. Desactive esta configuración si su proyecto puede recurrir a GLES2. (Este no es el caso de forma predeterminada y debe estar habilitado en la Configuración del proyecto). Esta configuración se ignora cuando el proyecto está configurado para usar GLES2 de forma predeterminada.

  • Tamaño máximo: El tamaño máximo del atlas en píxeles. Los valores más altos dan como resultado un atlas más eficiente, pero son menos compatibles con hardware antiguo/de gama baja. En caso de duda, deje esta configuración en su valor predeterminado (4096).

Captura

  • Habilitado: Esto habilita la captura de la sonda para que los objetos dinámicos puedan recibir iluminación indirecta. Independientemente del valor de este ajuste, los objetos dinámicos no podrán contribuir iluminación indirecta a la escena. Esta es una limitación de los mapas de luz.

  • Tamaño de celda: La distancia entre sondas de mapa de luz en unidades 3D. Los valores más altos dan como resultado una colocación de la sonda más dispersa, lo que reduce los tiempos de creación y el tamaño del archivo a costa de una menor precisión de iluminación para objetos dinámicos.

  • Calidad: La calidad de generación de la sonda de mapas de luz. Los valores más altos dan como resultado una iluminación más precisa, pero tardan más en crearse. Esta configuración no afecta la densidad de las sondas de mapa de luz, sólo su calidad.

  • Propagación: Similar a Propiedad de propagación de GIProbe. Los valores más altos dan como resultado una iluminación indirecta más brillante y difusa para objetos dinámicos. Ajuste este valor en función de su escena para que los objetos dinámicos se ajusten mejor a la iluminación estática creada.

Datos

  • Datos de la luz: Contiene los datos de la luz creada después del baking. Las texturas se guardan en el disco, pero también contiene los datos de captura de los objetos dinámicos, que pueden ser un poco pesados. Si estás usando los formatos .tscn (en lugar de .scn), puedes guardarlos en el disco.

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

  • Energía: Ajusta el brillo del mapa de luz. Los valores más altos dan como resultado mapas de luz más brillantes. Esto se puede ajustar en tiempo de ejecución para efectos dinámicos de corta duración, como tormentas eléctricas. Sin embargo, tenga en cuenta que afectará a todas las luces creadas.

  • Interior: Si está habilitado, los objetos dinámicos no utilizarán la iluminación ambiental y utilizarán sondas de luz para la iluminación ambiental exclusivamente. Si está desactivado, tanto la iluminación ambiental como las sondas de luz se utilizan para iluminar objetos dinámicos.

Truco

El archivo EXR generado se puede ver e incluso editar utilizando un editor de imágenes para realizar el pos-procesamiento si es necesario. Sin embargo, tenga en cuenta que los cambios en el archivo EXR se perderán cuando vuelva a crear mapas de luz.

Objetos dinámicos

En otros motores o implementaciones de lightmapper, se requiere colocar manualmente pequeños objetos llamados "sondas de luz" alrededor del nivel para generar datos de captura. Esto se utiliza para, entonces, transferir la luz a los objetos dinámicos que se mueven alrededor de la escena.

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