Mapeado de sombras
Introducción
El mapeado de sombras es una técnica común para proporcionar sombras en tiempo real a una escena 3D. Funciona renderizando una textura de mapa de profundidad desde el punto de vista de la fuente de luz. Entonces, cuando se sombrea un píxel de un modelo 3D, su valor de profundidad se compara con el mapa de profundidad y se sombrea más oscuro si está en la sombra o más claro si está iluminado por la luz.
Las sombras aumentan el realismo perceptivo de una escena y facilitan el cálculo de las posiciones relativas de los objetos.

Observa cómo en la escena de la izquierda de la imagen es imposible saber a qué distancia del plano están los objetos, pero en la escena de la derecha las sombras lo hacen más fácil.
Qt proporciona soporte para el mapeado de sombras para nuestros tres tipos de luz, DirectionalLight, PointLight y SpotLight. Para activar las sombras en tu escena primero tienes que configurar la luz para que proyecte sombras configurando castsShadow a true. Luego puedes controlar qué modelos proyectarán y recibirán sombras configurando castsShadows y receivesShadows a true o false.
Luces direccionales
La luz direccional emite luz en una dirección desde una fuente no identificable situada infinitamente lejos. Esto es similar al funcionamiento de la luz solar en la vida real. Una luz direccional tiene un alcance infinito y no disminuye.
Mapas de sombras en cascada
Uno de los problemas de DirectionalLight es que renderiza toda la escena desde el punto de vista de la luz. Esto puede dar lugar a sombras con aspecto de bloque cuando el tamaño del mapa de sombras no es el adecuado. Una opción para obtener una mejor calidad de renderizado es utilizar mapas de sombras en cascada (CSM). Qt soporta una versión de CSM llamada Parallell Split Shadow Maps (PSSM). PSSM funciona dividiendo la vista en varias partes y renderizando un mapa de sombra para cada parte.

Esta imagen muestra una imagen abstracta de un frustum de vista con divisiones PSSM. Tiene dos divisiones que terminan en tres cascadas.
De esta forma se puede obtener una mejor resolución del mapa de sombras cerca de la cámara, donde la calidad visual es más notable, y una resolución más baja lejos de la cámara, donde la calidad visual es menos notable.

La imagen de arriba muestra un mapa de sombras sin divisiones (izquierda) y un mapa de sombras con 3 divisiones (derecha).
Puede controlar el número de divisiones en cascada mediante la propiedad csmNumSplits y dónde están las divisiones mediante las propiedades csmSplit1, csmSplit2 y csmSplit3. Para obtener transiciones agradables entre las divisiones puede especificar una cierta cantidad de mezcla entre ellas con la propiedad csmBlendRatio.

La imagen de arriba muestra una vista ampliada de una costura en cascada sin mezcla activa.
Ten en cuenta que por cada división que añadas la aplicación tiene que renderizar otro shadowmap lo que afectará negativamente al rendimiento. El tamaño del área de mezcla afectará al rendimiento, así que manténgalo lo más pequeño posible.
Luz puntual
PointLight puede describirse como una esfera que emite luz con la misma intensidad en todas las direcciones desde el centro de la luz hasta un radio determinado. Esto es similar a la forma en que emite luz una bombilla.

PointLight renderiza su mapa de sombras en un cubemap, lo que significa que realiza seis pases de renderizado. Esto puede resultar bastante costoso desde el punto de vista computacional.
Luz puntual
SpotLight emite luz hacia una dirección en forma de cono, definida por la propiedad coneAngle. La intensidad de la luz disminuye al acercarse a coneAngle. El ángulo en el que la intensidad de la luz comienza a disminuir se define por innerConeAngle. Esto es similar a cómo emite luz una linterna o un foco.

A diferencia de PointLight, SpotLight renderiza su mapa de sombras en un único mapa de profundidad.
Rendimiento y ajuste de la escena
Aunque Qt intenta proporcionar valores por defecto razonables para las propiedades relacionadas con el mapeado de sombras, normalmente es necesario ajustarlas para que se adapten a la escena específica. Especialmente si la escena es mucho más pequeña o grande de lo esperado. En la siguiente sección se explicará con más detalle cómo ajustar los valores para que el mapa de sombras tenga un buen aspecto y, al mismo tiempo, mantenga el mejor rendimiento posible.
Sesgo de sombra
Shadow bias es una forma de eliminar las llamadas sombras-acné, que son sombras falsas que suelen aparecer en ciertos patrones. El sesgo de sombras desplaza la textura de profundidad del mapa de sombras de forma que las sombras aparezcan más alejadas del objeto que las produce, lo que a menudo soluciona el acné de sombras. El inconveniente es que si tienes demasiado sesgo de sombra puedes obtener un efecto llamado peter panning en el que la sombra está demasiado lejos del objeto de sombra. También es posible reducir el acné de sombras aumentando la resolución del mapa de sombras.

La imagen de arriba muestra una escena con 0 sombras parciales (izquierda) frente a 10 sombras parciales (derecha). La escena de la izquierda tiene algunas sombras falsas en la parte superior de los conos y cilindros.
Resolución del mapa de sombras
La resolución/calidad del mapa de sombras se controla mediante la propiedad shadowMapQuality. Una mayor calidad del mapa de sombras disminuye el bloqueo de las sombras, pero es más caro de renderizar, por lo que se debe establecer lo más bajo posible, manteniendo la calidad visual necesaria.

La imagen de arriba muestra una escena con una resolución de shadowmap baja frente a una resolución de shadowmap alta.
Calidad de las sombras suaves
Las sombras suaves son una forma de aproximarse al aspecto de las sombras en la vida real, donde se desvanecen de más duras a más suaves en los bordes. La calidad de las sombras suaves se controla mediante la propiedad softShadowQuality. Admite sombras duras sin suavidad, así como sombras suaves con filtrado porcentual (PCF) de calidad variable. Las sombras duras son las más baratas de renderizar y el PCF es cada vez más caro cuanto mayor es su calidad. Para controlar el radio de la sombra suave utilice la propiedad pcfFactor. El valor de pcfFactor no afecta a la velocidad de renderizado, pero cuanto mayor sea, mayor será la calidad de la sombra suave para que se vea bien.

La imagen de arriba muestra una escena con una sombra softShadowQuality Light.Hard a la izquierda y una escena con una softShadowQuality Light.PCF32 y pcfFactor 10 a la derecha.
Distancia lejana del mapa de sombras
La propiedad shadowMapFar se puede utilizar para controlar la distancia máxima del mapa de sombras. Esta propiedad funciona de forma ligeramente diferente para PointLight y SpotLight vs DirectionalLight.
Para PointLight/SpotLight determina cómo de grande debe ser el cuadro delimitador de la sombra renderizada, pero para DirectionalLight define a qué distancia de la cámara de la escena debe cubrir el mapa de sombras.

La imagen de arriba muestra la misma escena con la misma luz direccional pero dos valores diferentes para shadowMapFar.
Profundidad de bits del mapa de sombras
Hay ciertos escenarios donde tienes una escena muy grande causando que el shadowmap cubra una gran área en su eje de profundidad. Por ejemplo, si tienes muchos objetos lejos de la vista de la cámara que siguen proyectando sombras y necesitan formar parte de los límites del mapa de sombras. Lo que puede ocurrir en este caso es que incluso con un shadowBias más alto la escena siga teniendo artefactos de bandas. Una forma de solucionarlo es utilizar una profundidad de 32 bits en el mapa de sombras. Estableciendo la propiedad use32BitShadowmap a true habilitará esto en la luz específica.

La imagen de arriba muestra la misma escena con la misma luz direccional pero una usando un shadowmap de 32 bits y la otra usando un shadowmap de 16 bits.
Ver también Usando Iluminación Basada en Imágenes, Lightmaps e Iluminación Global, y Qt Quick 3D - Ejemplo de Mapas de Sombra en Cascada.
© 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.