Lightmaps e Iluminación Global
Introducción
Nota: A partir de Qt 6.4, el baking de lightmaps se encuentra en un estado temprano de previsualización tecnológica. Es probable que se produzcan cambios en las características, la calidad y la API en futuras versiones.
Los lightmaps bakeados permiten pregenerar la iluminación directa de luces como DirectionalLight, PointLight, y SpotLight, incluyendo las sombras proyectadas por las luces. En tiempo de ejecución, en lugar de realizar los cálculos apropiados en el fragment shader y, en el caso de las sombras, generar los mapas de sombras potencialmente costosos en tiempo real, se muestrea el mapa de imagen pregenerado.
Se genera un mapa de luz por cada Model. Incluso si un Model tiene múltiples submallas, y por lo tanto está asociado a múltiples materiales, habrá una única imagen lightmap generada para todo el modelo.
Los lightmaps se generan utilizando raytracing, que por naturaleza proporciona una oclusión adecuada ("la luz no viaja a través de las paredes"), y posiblemente sombras más realistas que las técnicas en tiempo real para la iluminación y el mapeado de sombras.
Y lo que es más importante, los mapas de luz también permiten hornear la iluminación indirecta, proporcionando una solución para la iluminación global. Esto tiene en cuenta los rayos de luz reflejados por otras superficies de la escena.
A continuación se muestra un ejemplo sencillo. La escena contiene cuatro modelos de rectángulo y una esfera, con un DirectionalLight apuntando hacia abajo y un PointLight. Los modelos de rectángulo están girados 0 y 90 grados, lo que exagera las limitaciones de los cálculos de iluminación en tiempo real, ya que todos son paralelos o perpendiculares a la dirección DirectionalLight.
En la segunda imagen, la escena se renderiza con el lightmapping activado, después de haber bakeado los lightmaps de los cinco modelos. Ambas luces están bakeadas, lo que significa que tanto la iluminación directa como la indirecta están bakeadas. La iluminación indirecta utiliza 256 samples y un máximo de 3 bounces. Los lightmaps resultantes se desenotizaron. El resultado es una imagen mucho más realista.
Iluminación en tiempo real

Iluminación totalmente bakeada

A continuación se muestra un fragmento que muestra cómo se obtuvieron los resultados de los mapas de luz. La diferencia radica en las propiedades usedInBakedLighting, bakeMode, y bakedLightmap. Para este ejemplo, el tamaño del lightmap se ha reducido utilizando la propiedad texelsPerUnit, para ahorrar espacio en disco y reducir los tiempos de carga de la aplicación.
DirectionalLight {
bakeMode: Light.BakeModeAll
eulerRotation.x: -90
brightness: 0.5
castsShadow: true
shadowFactor: 75
}
PointLight {
bakeMode: Light.BakeModeAll
y: 200
z: 100
color: "#d9c62b"
castsShadow: true
shadowFactor: 75
}
Model {
usedInBakedLighting: true
bakedLightmap: BakedLightmap {
enabled: true
key: "sphere1"
}
source: "#Sphere"
materials: PrincipledMaterial { }
y: 100
}
Model {
usedInBakedLighting: true
bakedLightmap: BakedLightmap {
enabled: true
key: "rect1"
}
source: "#Rectangle"
materials: PrincipledMaterial { }
eulerRotation.x: -90
scale: Qt.vector3d(10, 10, 10)
}
// ... three additional Rectangle models, with rotations 0, 90, and -90En el ejemplo anterior se han utilizado luces totalmente bakeadas. Una luz también puede configurarse para que sólo utilice la iluminación baked para la iluminación indirecta, mientras que realiza la iluminación directa y el mapeado de sombras en tiempo real. En la escena de abajo hay 5 luces puntuales, todas ellas configuradas en BakeModeIndirect para la segunda captura de pantalla. Mientras que la iluminación directa y las sombras se ven idénticas, la segunda imagen se ve significativamente mejor debido a un grado de iluminación global añadido.
Iluminación en tiempo real

Con iluminación indirecta añadida

Consideraciones importantes al trabajar con lightmaps
Las luces que contribuyen a la iluminación baked tienen su propiedad bakeMode establecida a Light.BakeModeIndirect o Light.BakeModeAll. Esta última indica que tanto la contribución directa como indirecta para esa luz en particular proviene del lightmap. La contribución directa siempre incluye también las sombras. Por otro lado, si la intención con el lightmap es sólo añadir iluminación indirecta a la escena para una luz en particular, mientras se sigue calculando la iluminación directa (y se realiza el mapeado de sombras) en tiempo real, entonces la luz debería usar Light.BakeModeIndirect en su lugar.
Nota: Los mapas de luz son, en general, adecuados para modelos que son estáticos en lo que se refiere a transformación, geometría y materiales. Lo mismo se aplica a las luces que participan en la iluminación baked.
Por ejemplo, una escena que rota un Model animando la propiedad eulerRotation dará resultados visualmente incorrectos al aplicar un lightmap a ese Model. Los resultados de renderizado para ese Model en particular serán incorrectos, ya que el lightmap pregenerado sólo captura un único estado de rotación para el objeto. Lo mismo ocurriría, tomando otro ejemplo, si el material de una de las submallas del modelo cambiara dinámicamente su propiedad baseColor en función del tiempo (animación) o de alguna interacción del usuario. El mapa de luz sólo puede capturar un material dado baseColor. Lo mismo ocurre con las luces. Por ejemplo, un DirectionalLight que rota, cambia su brillo, color, etc. con el tiempo no es adecuado para iluminación baked.
Nota: Por otro lado, siempre es una elección del diseñador cuándo utilizar lightmapping. Especialmente con las luces de BakeModeIndirect, es probable que haya escenas en las que los resultados sigan siendo visualmente satisfactorios, aunque algunos de los objetos de la escena lightmapped empleen un comportamiento dinámico.
Lightmapping es un motor y una herramienta complejos. Sustituye y reimplementa varias partes del proceso de renderizado del motor. Funciona con un modelo de renderizado fundamentalmente diferente al crear mapas de luz, aunque sigue consumiendo e interoperando con la misma estructura de escena, datos de activos y estructuras de datos del motor. Los resultados basados en el trazado de rayos a menudo superan a las alternativas en tiempo real, a veces significativamente, lo que se consigue a expensas de limitaciones, como la obligatoriedad de la estática de los modelos y las luces implicadas y, a veces, problemas de calidad y artefactos de renderizado específicos del lightmapping.
En la práctica, será una decisión artística de los diseñadores qué tipo de iluminación utilizar y cuándo. Las tres configuraciones de bakeMode tienen su utilidad, y las escenas complejas y más grandes pueden muy bien utilizar las tres para diferentes luces, dependiendo de lo que se considere adecuado para una determinada sección de la escena, y qué tipo de modelos, materiales y comportamiento dinámico están presentes. Lightmapping no es un simple interruptor de tipo on/off que se puede activar para cualquier escena y aplicación, sino una potente característica que supone una cuidadosa evaluación de las necesidades de iluminación de una escena determinada, y a menudo requiere que el contenido de la escena y el comportamiento se diseñen en consecuencia, combinado con un bucle de prueba y ajuste donde se exploran y prueban diferentes ajustes de baking y calidad de lightmap antes de decidir el enfoque final y los ajustes relacionados.
Nota: Los mapas de luz no admiten superficies de dos caras. Con la iluminación en tiempo real, un material con cull mode de Material.NoCulling invierte automáticamente la normal según corresponda en función de la orientación del fragmento. Esto no es una opción para lightmaps ya que el baking de lightmaps no opera en el espacio de vista. Por lo tanto, evita la iluminación bakeada para modelos que dependan de esto.
Horneado de mapas de luz
Propiedades y tipos relevantes para baking lightmaps, es decir, el proceso offline de generar los mapas de imagen que capturan la iluminación directa e indirecta y que pueden ser utilizados por el renderizador en posteriores ejecuciones de la aplicación:
- Model::usedInBakedLighting
- Model::lightmapBaseResolution,
- Light::bakeMode,
- Lightmapper y SceneEnvironment::lightmapper
- BakedLightmap y Model::bakedLightmap
A partir de Qt 6.4, el proceso de baking de lightmaps tiene que ser activado manualmente. Siempre que el argumento de línea de comandos --bake-lightmaps esté presente, o la variable de entorno QT_QUICK3D_BAKE_LIGHTMAPS se establezca en 1 (u otro valor distinto de cero), el motor trabajará en modo baking y saldrá de la aplicación una vez que el baking se haya completado. Los pasos del proceso de baking pueden seguirse comprobando los mensajes impresos en la salida de depuración. El resultado es un archivo binario (lightmaps.bin por defecto) escrito en el directorio de trabajo actual que contiene todos los lightmaps bakeados en la escena. También se creará un archivo .raw que contiene el mapa de luz completo y algunos datos extra necesarios para la eliminación de ruido. Cada lightmap se identifica de forma única en el archivo por la clave única de BakedLightmap::key.
La preparación de una escena lightmapped requiere los siguientes pasos principales:
- Identificar qué modelos deben utilizar un lightmap, y qué modelos deben contribuir al lightmap. Los modelos que forman parte de la escena lightmapped deben establecer Model::usedInBakedLighting en true. Los modelos que son lightmapped (es decir, un lightmap debe ser bakeado para ellos) deben además establecer Model::bakedLightmap a un objeto BakedLightmap habilitado, que proporciona una clave única que identificará persistentemente la instancia particular del objeto Model (esto es porque Qt necesita una clave para identificar los datos del modelo en el almacenamiento persistente en disco). Sólo se garantiza que los modelos con geometría, transformación y materiales estáticos tengan resultados correctos cuando se les aplique el lightmapping en tiempo de ejecución. Por lo general, cualquier cosa que conduzca a una transformación del mundo no estática a lo largo del tiempo, como una posición, rotación o escala animada o modificada dinámicamente, descalificará al modelo para participar. Sin embargo, las necesidades artísticas pueden invalidar esto, especialmente en el caso de los modelos que sólo contribuyen a la iluminación indirecta pero que no están mapeados. En estos casos, a menudo puede ser visualmente aceptable tener transformaciones dinámicas, pero esto depende siempre del modelo y de la escena en cuestión.
- Identifique qué luces deben contribuir y en qué grado. Light::bakeMode ofrece tres opciones:
- Light.BakeModeDisabled, la opción por defecto, que hace que la luz sea ignorada a efectos de lightmapping.
- Light.BakeModeIndirect es a menudo la opción "segura", si el único objetivo es tener un nivel de iluminación global (iluminación indirecta) en la escena, mientras que no afecta a los resultados de renderizado para la luz de otras maneras. En este modo el renderizador continuará realizando toda la iluminación, incluyendo difusa, especular, contribuciones al cielo/entorno, y mapeado de sombras para esta luz utilizando las técnicas estándar en tiempo real. Sin embargo, la luz contribuirá a la iluminación indirecta utilizando los datos precalentados, lo que posiblemente lleve a iluminar superficies que de otro modo quedarían intactas por los cálculos estándar de iluminación en tiempo real.
- Light.BakeModeAll es una opción que probablemente se utilizará sólo para ciertas luces, basándose en la evaluación de los diseñadores de lo que se considera apropiado para una escena determinada. En este modo toda la contribución de la luz es bakeada, incluyendo las sombras. A partir de Qt 6.4 la iluminación especular no está soportada como parte de la iluminación baked, por lo que dichas luces no tendrán contribuciones especulares. Por otro lado, generarán sombras trazadas por rayos y tendrán la oclusión adecuada para la luz (no "pasarán a través de las paredes", por ejemplo), ya que aquí todas las contribuciones de iluminación directa resultantes de la luz son trazadas por rayos en el momento de bakear el lightmap, en lugar de ser calculadas en tiempo de ejecución. Además, la iluminación indirecta se bakea, igual que con BakeModeIndirect.
- Ejecutar la escena (aplicación) en modo baking, asegurando que los lightmaps se generan correctamente. A partir de Qt 6.4, se espera que las aplicaciones estén estructuradas de forma que la escena lightmapped sea la primera vista mostrada, o que la escena en cuestión pueda ser cargada con un visor QML como la herramienta
qml. Una vez finalizado el baking, cuyo progreso puede seguirse en la salida de consola/debug, la aplicación sale. - Ejecutando la escena (aplicación) normalmente, para ver cómo se ve con los lightmaps cargados. Entonces puede comenzar el ajuste:
- Para algunos modelos tendrá sentido reducir texelsPerUnit del valor por defecto a algo más pequeño. Esto se aplica especialmente a las primitivas incorporadas y a cualquier cosa con una geometría lo suficientemente simple. Esto conduce a lightmaps más pequeños y tiempos de bakeo más rápidos. Cuando se bakea por primera vez, el valor por defecto debería ser suficiente, el valor puede ser ajustado después.
- El objeto Lightmapper expone numerosos ajustes que tienen valores por defecto razonables, pero no es improbable que algunos de ellos tengan que ser ajustados para que coincidan con las expectativas de los diseñadores. Por ejemplo, samples y bounces pueden modificarse para afectar a la calidad de la iluminación indirecta, mientras que indirectLightFactor permite hacer más prominente la contribución indirecta. Si se producen artefactos, en particular alrededor de las sombras, puede ajustarse bias.
- La eliminación de ruido de los mapas de luz generados es esencial. La iluminación indirecta se calcula utilizando el trazado de trayectorias, que produce imágenes ruidosas en función del número de las samples utilizadas. Aumentar el número de muestras reduce el ruido, pero aumenta el tiempo necesario para generar el mapa de luz. Independientemente del número de muestras, casi siempre tendrá sentido ejecutar un denoiser en los lightmaps generados, que son imágenes RGBA de 32 bits en coma flotante almacenadas en un archivo binario.
A partir de Qt 6.5, se proporciona una solución interactiva en tiempo de ejecución a través de DebugView. En Herramientas hay ahora un botón que, al pulsarlo, desencadenará el proceso de baking. Aparecerá una ventana mostrando el proceso actual. Se puede cancelar pulsando el botón de cancelación o cerrando la ventana. Una vez completado, se escribirá el binario del mapa de luz en el directorio actual.
Denoising
A continuación se muestra un ejemplo de una escena de caja Cornell, renderizada primero usando el lightmap baked con 256 samples y un máximo de 3 bounces. En el segundo ejemplo, el archivo de imagen generado ha sido denoiseado, y los resultados se ven significativamente mejor, con el ruido casi desaparecido.
Original

Eliminación de ruido

La eliminación de ruido se realiza automáticamente en cada mapa de luz bakeado. Es posible realizar sólo la eliminación de ruido, si existe un archivo de mapa de luz baked .raw en el directorio de trabajo, haciendo clic en el botón Denoise en DebugView. También es posible eliminar el ruido llamando a la aplicación con el argumento --denoise-lightmaps. Para ajustar la intensidad de la eliminación de ruido, se puede utilizar la propiedad denoiseSigma.
UVs Lightmap
Las coordenadas UV de los mapas de luz no utilizan los mismos datos UV que las texturas normales. Cuando se renderiza con lightmaps, ni los datos UV0 ni UV1 son utilizados por el renderizador al muestrear el lightmap. En su lugar, hay un canal UV adicional dedicado en la malla, que contiene gráficos UV dispuestos de una manera que es adecuada para los propósitos de lightmapping. Esto implica evitar solapamientos y disponer de relleno cuando sea necesario. Para los datos UV normales no existen tales requisitos, y uno puede muy bien querer utilizar las mismas coordenadas U y V para más de un vértice.
El proceso de generar un conjunto UV adecuado se llama desenvoltura UV lightmap. Qt lo realiza al generar los mapas de luz y almacena la malla resultante en el archivo de mapas de luz para que siempre se cargue y utilice una malla compatible para el mapa de luz generado. Esto significa que, si un modelo va a utilizar siempre la iluminación baked, entonces el archivo de malla de origen no necesita ser enviado con la aplicación.
Tamaño de las texturas lightmap
Para cada modelo, incluyendo todas sus submallas, el proceso de baking de lightmap determinará un tamaño de textura de lightmap adecuado durante la fase de generación de UV de lightmap. Esto tiene un impacto en la calidad, el rendimiento y el uso de recursos (tanto en disco como en memoria).
El valor por defecto suele ser adecuado y no necesita ajustes, especialmente para modelos de complejidad media o alta.
Sin embargo, para modelos muy simples puede ser deseable reducir manualmente el tamaño, ya que un tamaño de lightmap más pequeño podría seguir proporcionando resultados visualmente buenos, mientras que la reducción del tamaño de los activos (imagen lightmap) ahorra espacio en disco y memoria. Para ello, establece texelsPerUnit en un número adecuadamente pequeño. La anchura y altura reales del mapa de luz, dependiendo del tamaño y la geometría del modelo, intentarán aproximarse a la densidad de texel para que coincida con texelsPerUnit.
Al cambiar el valor, siempre hay que volver a crear los lightmaps e inspeccionar visualmente los resultados para evaluar los efectos del cambio de tamaño del lightmap.
Uso de mapas de luz en tiempo de ejecución
Propiedades y tipos relevantes a la hora de utilizar los lightmaps en tiempo de ejecución:
Una vez que el baking se ha completado con éxito, la ejecución normal de la aplicación (sin el argumento de la línea de comandos o la variable de entorno establecida) ahora recogerá las imágenes de lightmaps generadas y las renderizará correctamente, lo que no es posible hasta que los lightmaps hayan sido bakeados primero. Si se desea, la aplicación puede colocarlos en una ubicación diferente, o enviarlos como parte del ejecutable a través del Sistema de Recursos Qt. Esto se habilita mediante la propiedad source.
Tomando el código de ejemplo con la esfera y cuatro rectángulos de arriba, el proceso de baking genera un archivo lightmaps.bin que contiene todas las mallas baked y lightmaps. La aplicación necesita enviar este archivo, para que pueda ser encontrado por el motor, en la ubicación especificada por source.
Ver también Qt Quick 3D - Baked Lightmap Example y Qt Quick 3D - SSGI Lightmap Example.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.