Técnicas habituales para mejorar los mapas de profundidad de sombras
Los mapas de sombras, introducidos por primera vez en 1978, son una técnica común para agregar sombras a los juegos. Tres décadas después, a pesar de los avances en el hardware y el software, los artefactos de sombreado, es decir, bordes escalonado, alias de perspectiva y otros problemas de precisión, persisten.
En este artículo técnico se proporciona información general sobre algunos algoritmos comunes de mapa de profundidad de sombras y artefactos comunes, y se explican varias técnicas, que van en dificultad de básico a intermedio, que se pueden usar para aumentar la calidad de los mapas de sombras estándar. La adición de mapas de sombras básicos a un título suele ser sencilla, pero comprender los matices de los artefactos de sombra puede ser difícil. Este artículo técnico está escrito para el desarrollador de gráficos intermedios que ha implementado sombras, pero no entiende por qué aparecen artefactos específicos y no está seguro de cómo solucionarlos.
La selección de las técnicas correctas para mitigar artefactos específicos no estrivial. Cuando se abordan las deficiencias del mapa de sombras, la diferencia de calidad puede ser impresionante (Figura 1). La implementación correcta de estas técnicas mejora drásticamente las sombras estándar. Las técnicas que se explican en este artículo se implementan en el ejemplo CascadedShadowMaps11 en el SDK de DirectX.
Figura 1. Sombras con artefactos graves (izquierda) y sombras después de implementar las técnicas descritas en este artículo (derecha)
Revisión de mapas de profundidad de sombras
El algoritmo de mapa de profundidad de sombras es un algoritmo de dos pasos. El primer paso genera un mapa de profundidad en el espacio claro. En el segundo paso, este mapa se usa para comparar la profundidad de cada píxel en el espacio de luz con su profundidad correspondiente en el mapa de profundidad del espacio de luz.
Ilustración 2. Partes clave de una escena de sombra
Pase 1
La escena se muestra en la figura 2. En el primer paso (figura 3), la geometría se representa en un búfer de profundidad desde el punto de vista de la luz. Más concretamente, el sombreador de vértices transforma la geometría en un espacio de vista clara.
El resultado final de este primer paso es un búfer de profundidad que contiene la información de profundidad de la escena desde el punto de vista de la luz. Ahora se puede usar en el paso 2 para determinar qué píxeles se ocluyen de la luz.
Figura 3. Primer paso de asignación de sombras básica
Pase 2
En el segundo paso (figura 4), el sombreador de vértices transforma cada vértice dos veces. Cada vértice se transforma en el espacio de vista de la cámara y se pasa al sombreador de píxeles como posición. Cada vértice también se transforma mediante la matriz de textura de proyección de vista de la luz y se pasa al sombreador de píxeles como coordenada de textura. La matriz view-projection-texture es la misma matriz que se usa para representar la escena en el paso 1 con una transformación adicional. Es una transformación que escala y traduce los puntos del espacio de vista (–1 a 1 en X e Y) al espacio de textura (de 0 a 1 en X y 1 a 0 en Y).
El sombreador de píxeles recibe la posición interpolada y las coordenadas de textura interpoladas. Todo lo necesario para realizar la prueba de profundidad ahora está en esta coordenada de textura. La prueba de profundidad ahora se puede realizar mediante la indexación del búfer de profundidad desde el primer paso con las coordenadas de textura X e Y y comparando el valor de profundidad resultante con la coordenada Z-texture.
Figura 4. Segundo paso de asignación de sombras básica
Artefactos de mapa de sombras
El algoritmo de mapa de profundidad de sombras es el algoritmo de sombreado en tiempo real más usado, pero sigue generando varios artefactos que requieren mitigación. Los tipos de artefactos que se pueden producir se resumen a continuación.
Alias de perspectiva
El alias de perspectiva, un artefacto común, se muestra en la figura 5. Se produce cuando la asignación de píxeles en el espacio de vista a los elementos de textura del mapa de sombras no es una relación uno a uno. Esto se debe a que los píxeles cercanos al plano cercano están más cerca y requieren una resolución de mapa de sombras mayor.
En la figura 6 se muestra un mapa de sombras y un frustum de vista. Cerca del ojo, los píxeles están más cerca y muchos píxeles se asignan a los mismos elementos de textura de sombra. Los píxeles por el plano lejano se extienden, lo que reduce el alias de perspectiva.
Figura 5. Alias de perspectiva alta (izquierda) frente a alias de perspectiva baja (derecha)
Para la imagen a la izquierda, el alias de perspectiva es superior; demasiados píxeles de espacio ocular se asignan a los mismos elementos de textura de mapa de sombras. En la imagen de la derecha, el alias de perspectiva es bajo porque hay una asignación de 1:1 entre los píxeles del espacio ocular y los elementos de textura de mapa de sombras.
Figura 6. Visualización de frustum con mapa de sombras
Los píxeles claros del plano lejano representan alias de perspectiva baja y píxeles oscuros en el plano cercano representan alias de perspectiva alta.
La resolución del mapa de sombras también puede ser demasiado alta. Aunque una resolución más alta es menos notable, sin embargo puede dar lugar a objetos pequeños, como cables telefónicos, no sombras de conversión. Además, tener una resolución demasiado alta puede causar problemas graves de rendimiento debido a patrones de acceso a texturas.
Los mapas de sombras de perspectiva (PSM) y los mapas de sombras de perspectiva de espacio claro (LSPSM) intentan abordar el alias de perspectiva al hacer que la matriz de proyección de la luz coloque más elementos de textura cerca del ojo donde se necesiten. Desafortunadamente, ninguna técnica puede resolver el alias de perspectiva. La parametrización de la transformación necesaria para asignar píxeles de espacio ocular a elementos de textura en el mapa de sombras no se puede enlazar mediante una asimetría lineal. Se requiere una parametrización logarítmica. Los PSM ponen demasiado detalle cerca del ojo, lo que hace que las sombras distantes sean de baja calidad o incluso desaparezcan. Los LSPSM realizan un mejor trabajo de encontrar un punto intermedio entre aumentar la resolución cerca del ojo y dejar suficiente detalle para los objetos lejos. Ambas técnicas degeneran en sombras ortográficas en algunas configuraciones de escena. Esta degeneración se puede contrarrestar mediante la representación de un mapa de sombras independiente para cada cara del frustum de vista, aunque esto es costoso. Los mapas de sombras de perspectiva logarítmica (LogPSM) también representan un mapa independiente por cara del frustum de la vista. Esta técnica usa la rasterización no lineal para colocar más elementos de textura cerca del ojo. El hardware de clase D3D10 y D3D11 no admiten la rasterización no lineal. Para obtener más información sobre estas técnicas y algoritmos, consulte la sección Referencias.
Los mapas de sombras en cascada (CSM) son la técnica más popular para tratar el alias de perspectiva. Aunque los CSM se pueden combinar con PSM y LSPSM, no es necesario. El uso de CSM para corregir errores de alias de perspectiva se aborda en el artículo complementario Mapas de sombras en cascada.
Alias de projective
El alias projectivo es más difícil de mostrar que el alias de perspectiva. Las sombras distendidas resaltadas en la figura 7 muestran errores de alias proyectados. El alias projectivo se produce cuando la asignación entre elementos de textura en el espacio de la cámara a los elementos de textura en el espacio de luz no es una relación uno a uno; esto se debe a la orientación de la geometría con respecto a la cámara de luz. El alias projectivo se produce cuando el plano tangente de la geometría se convierte en paralelo a los rayos de luz.
Ilustración 7. Alias de proyecto alto frente a alias de proyecto bajo
Las técnicas que se usan para mitigar los errores de alias de perspectiva también mitigan el alias proyectado. El alias projectivo se produce cuando la superficie normal es ortogonal a la luz; estas superficies deben recibir menos luz en función de ecuaciones de iluminación difusa.
Acné sombreado y Self-Shadowing erróneos
El acné sombreado (figura 8), un término sinónimo de sombreado erróneo, se produce cuando el mapa de sombras cuantifica la profundidad sobre un elemento de textura completo. Cuando el sombreador compara una profundidad real con este valor, es tan probable que se sombree automáticamente, ya que es no sombreado.
Otra razón para el acné de sombra es que el elemento de textura en el espacio de luz es tan cercano a la profundidad del elemento de textura correspondiente en el mapa de profundidad que los errores de precisión hacen que la prueba de profundidad falle erróneamente. Una razón para esta diferencia de precisión es que el hardware de rasterización de función fija calculó el mapa de profundidad, mientras que la profundidad que se va a comparar fue calculada por el sombreador. El alias projectivo también puede causar acné de sombra.
Figura 8. Artefacto de acné sombreado
Como se muestra en la imagen izquierda, algunos de los píxeles no pudieron realizar la prueba de profundidad y crearon artefactos y patrones moiré. Con el fin de reducir el sombreado erróneo, los límites en el plano cercano y el plano lejano para el frustum de la vista de espacio claro deben calcularse lo más estrechamente posible. El sesgo de profundidad basado en la escala de pendientes y otros tipos de sesgo son otras soluciones que se usan para mitigar el acné de sombra.
Peter Panning
El término Peter Panning deriva su nombre de un personaje de libro infantil cuya sombra se desasocia y que podía volar. Este artefacto hace que los objetos con sombras que faltan parezcan desasociar y flotar sobre la superficie (figura 9).
Figura 9. Artefacto de Peter Panning
En la imagen de la izquierda, la sombra se desasocia del objeto, creando un efecto flotante.
Una técnica para eliminar el acné de la superficie es agregar algún valor a la posición de píxel en el espacio de luz; esto se denomina agregar un desplazamiento de profundidad. Peter Panning da como resultado cuando el desplazamiento de profundidad utilizado es demasiado grande. En este caso, el desplazamiento de profundidad hace que se supere erróneamente la prueba de profundidad. Al igual que el acné de sombra, Peter Panning se agrava cuando no hay precisión suficiente en el búfer de profundidad. El cálculo de planos cercanos y planos lejanos también ayuda a evitar Peter Panning.
Técnicas para mejorar mapas de sombras
Agregar sombras a un título es un proceso. El primer paso es conseguir que los mapas de sombras básicos funcionen. El segundo consiste en asegurarse de que todos los cálculos básicos se realizan de forma óptima: frusta se ajusta lo más estrechamente posible, se utiliza el sesgo a escala de pendientes, etc. Una vez habilitadas las sombras básicas y tener el mejor aspecto posible, el desarrollador tiene una mejor idea de qué algoritmos son necesarios para conseguir que las sombras sean suficientes de fidelidad. En esta sección se proporcionan sugerencias básicas que pueden ser necesarias para obtener mapas de sombras básicos que se muestran mejor en esta sección.
sesgo de profundidad de Slope-Scale
Como se mencionó anteriormente, el auto-sombra puede conducir al acné de sombra. Agregar demasiado sesgo puede dar lugar a Peter Panning. Además, los polígonos con pendientes empinadas (relativas a la luz) sufren más de alias proyectados que los polígonos con pendientes poco profundas (relativas a la luz). Por este motivo, cada valor de mapa de profundidad puede necesitar un desplazamiento diferente en función de la pendiente del polígono en relación con la luz.
El hardware de Direct3D 10 tiene la capacidad de inclinar un polígono en función de su pendiente con respecto a la dirección de la vista. Esto tiene el efecto de aplicar un sesgo grande a un polígono que se ve arista hacia la dirección de la luz, pero no aplicar ningún sesgo a un polígono orientado directamente a la luz. En la figura 10 se muestra cómo dos píxeles vecinos pueden alternar entre sombreado y no sombreado al realizar pruebas con la misma pendiente no sesgada.
Figura 10. Sesgo de profundidad escalado de pendientes en comparación con la profundidad no sesgada
Cálculo de una proyección ajustada
Ajustar estrechamente la proyección de la luz al frustum de vista aumenta la cobertura del mapa de sombras. En la figura 11 se muestra que el uso de una proyección arbitraria o el ajuste de la proyección a los límites de la escena da como resultado un alias de perspectiva superior.
Figura 11. Frustum de sombra arbitraria y frustum de sombra encajan en la escena
La vista es desde el punto de vista de la luz. El trapezoide representa el frustum de la cámara de vista. La cuadrícula dibujada sobre la imagen representa el mapa de sombras. La imagen de la derecha muestra que el mismo mapa de sombras de resolución crea más cobertura de elementos de textura cuando se ajusta más estrechamente a la escena.
En la figura 12 se muestran los frustums que se ajustan correctamente. Para calcular la proyección, los ocho puntos que componen el frustum de vista se transforman en espacio de luz. A continuación, se encuentran los valores mínimo y máximo de X e Y. Estos valores componen los límites de una proyección ortográfica.
Ilustración 12. Ajuste de proyección de sombra para ver frustum
También es posible recortar el frustum a la escena AABB para obtener un límite más ajustado. Esto no se recomienda en todos los casos porque esto puede cambiar el tamaño de la proyección de la cámara de luz de fotograma a fotograma. Muchas técnicas, como las descritas en la sección Movimiento de la luz Texel-Sized Incrementos, proporcionan mejores resultados cuando el tamaño de la proyección de la luz permanece constante en cada fotograma.
Calcular el plano cercano y el plano lejano
El plano cercano y el plano lejano son las piezas finales necesarias para calcular la matriz de proyección. Cuanto más estrechamente se encuentren los planos, más precisos son los valores del búfer de profundidad.
El búfer de profundidad puede ser de 16 bits, 24 o 32 bits, con valores entre 0 y 1. Por lo general, los búferes de profundidad son puntos fijos, con los valores cercanos al plano cercano agrupados más estrechamente que los valores cercanos al plano lejano. El grado de precisión disponible para el búfer de profundidad viene determinado por la proporción del plano cercano al plano lejano. El uso del plano más estrecho posible cerca o lejos podría permitir el uso de un búfer de profundidad de 16 bits. Un búfer de profundidad de 16 bits podría reducir el uso de memoria al tiempo que aumenta la velocidad de procesamiento.
AABB-Based plano cercano y plano lejano
Una manera fácil e ingenua de calcular el plano cercano y el plano lejano es transformar el volumen delimitador de la escena en espacio de luz. El valor de coordenada Z más pequeño es el plano cercano y el valor de coordenada Z más grande es el plano lejano. Para muchas configuraciones de la escena y la luz, este enfoque es suficiente. Sin embargo, el peor escenario puede dar lugar a una pérdida significativa de precisión en el búfer de profundidad; En la figura 13 se muestra este escenario. Aquí el intervalo del plano cercano al plano lejano es cuatro veces mayor de lo necesario.
El frustum de vista de la figura 13 se eligió intencionadamente para ser pequeño. Un frustum de vista pequeño se muestra en una escena muy grande que consta de pilares que se extienden desde la cámara de vista. El uso de la escena AABB para los planos cercanos y lejanos no es óptimo. El algoritmo CSM descrito en el artículo técnico Mapas de sombras en cascada debe calcular planos cercanos y lejanos para frustums muy pequeños.
Ilustración 13. Aviones cercanos y lejanos basados en la escena AABB
Frustum-Based plano cercano y plano lejano
Otra técnica para calcular los planos cercanos y lejanos es transformar el frustum en espacio ligero y usar los valores mínimos y máximos en Z como los planos cercanos y lejanos, respectivamente. En la figura 14 se muestran los dos problemas con este enfoque. En primer lugar, el cálculo es demasiado conservador, como se muestra cuando el frustum se extiende más allá de la geometría de la escena. En segundo lugar, el plano cercano podría estar demasiado apretado, lo que provocaba que se recortaran las sombras.
Figura 14. Planos cercanos y lejanos basados únicamente en la vista frustum
Frustum claro intersecado con la escena para calcular planos cercanos y lejanos
La manera adecuada de calcular los planos cercanos y lejanos se muestra en la figura 15. Cuatro de los planos del frustum de luz ortográfica se calcularon utilizando el mínimo y máximo de las coordenadas X e Y del frustum de la vista en el espacio de luz. Los dos últimos planos del frustum de vista ortogonal son los planos cercanos y lejanos. Para encontrar estos planos, los límites de la escena se recortan contra los cuatro planos de frustum ligeros conocidos. Los valores Z más pequeños y mayores del límite recién recortado representan el plano cercano y el plano lejano, respectivamente.
El código que realiza esta operación se encuentra en el ejemplo CascadedShadowMaps11. Los ocho puntos que componen el AABB del mundo se transforman en espacio ligero. La transformación de los puntos en espacio de luz simplifica las pruebas de recorte. Los cuatro planos conocidos del frustum ligero ahora se pueden representar como líneas. El volumen delimitador de escenas en el espacio de luz se puede representar como seis cuadrilaterales. Estos 6 cuadrilaterales se pueden convertir en 12 triángulos para el recorte basado en triángulos. Los triángulos se recortan contra los planos conocidos del frustum de la vista (son líneas horizontales y verticales en X e Y en espacio claro). Cuando se encuentra un punto de intersección en X e Y, el triángulo 3D se recorta en ese momento. Los valores Z mínimo y máximo de todos los triángulos recortados son el plano cercano y el plano lejano. En el ejemplo CascadedShadowMaps11 se muestra cómo realizar este recorte en la función ComputeNearAndFar .
Hay dos técnicas más que podrían usarse para calcular el plano más estrecho posible cerca y lejos. Estas técnicas no se muestran en el ejemplo CascadedShadowMaps.
Incluso más estrechos planos cercanos y lejanos se podrían calcular interseciendo una jerarquía de una escena o objetos individuales en una escena contra el frustum de luz. Esto sería computacionalmente más complejo. Aunque no se muestra en el ejemplo CascadedShadowMaps11, podría tratarse de una técnica válida para algunos iconos.
El plano lejano podría calcularse tomando el mínimo de:
- La profundidad más grande del frustum de la vista en el espacio de luz.
- La profundidad más grande de la intersección del frustum de la vista y la escena AABB.
Este enfoque puede ser problemático cuando se usa con mapas de sombras en cascada donde es posible indexar fuera de un frustum de vista. En este caso, es posible que falte geometría en el mapa de sombras.
Figura 15. Planos cercanos y lejanos basados en la intersección de los cuatro planos calculados del frustum de luz y la geometría delimitación de la escena
Mover la luz en incrementos de Texel-Sized
Un artefacto común en los mapas de sombras es el efecto de borde atenuado. A medida que se mueve la cámara, los píxeles a lo largo de los bordes de las sombras se iluminan y oscurecen. Esto no se puede ver en imágenes fijas, pero es muy notable y distraído en tiempo real. En la figura 16 se resalta este problema y en la figura 17 se muestra el aspecto de los bordes de sombra.
El error de borde escalonado se produce porque la matriz de proyección de luz se vuelve a calcular cada vez que se mueve la cámara. Esto crea diferencias sutiles en los mapas de sombras generados. Todos los factores siguientes pueden influir en la matriz creada para enlazar la escena.
- Tamaño del frustum de la vista
- Orientación del frustum de vista
- Ubicación de la luz
- Ubicación de la cámara
Cada vez que cambia esta matriz, los bordes de las sombras podrían cambiar.
Figura 16. Bordes de sombras escalonado
Los píxeles a lo largo del borde de la sombra entran y salen de la sombra a medida que la cámara se mueve de izquierda a derecha.
Figura 17. Sombras sin bordes resplandecientes
Los bordes de la sombra permanecen constantes a medida que la cámara se mueve de izquierda a derecha.
Para las luces direccionales, la solución a este problema es redondear el valor mínimo/máximo en X e Y (que componen los límites de proyección ortográfica) a incrementos de tamaño de píxel. Esto se puede hacer con una operación de división, una operación de planta y una multiplicación.
vLightCameraOrthographicMin /= vWorldUnitsPerTexel;
vLightCameraOrthographicMin = XMVectorFloor( vLightCameraOrthographicMin );
vLightCameraOrthographicMin *= vWorldUnitsPerTexel;
vLightCameraOrthographicMax /= vWorldUnitsPerTexel;
vLightCameraOrthographicMax = XMVectorFloor( vLightCameraOrthographicMax );
vLightCameraOrthographicMax *= vWorldUnitsPerTexel;
El valor vWorldUnitsPerTexel se calcula tomando un límite del frustum de vista y dividiendo por el tamaño del búfer.
FLOAT fWorldUnitsPerTexel = fCascadeBound /
(float)m_CopyOfCascadeConfig.m_iBufferSize;
vWorldUnitsPerTexel = XMVectorSet( fWorldUnitsPerTexel, fWorldUnitsPerTexel, 0.0f, 0.0f );
El límite del tamaño máximo del frustum de la vista da como resultado un ajuste más flexible para la proyección ortográfica.
Es importante tener en cuenta que la textura es de 1 píxel más grande en ancho y alto al usar esta técnica. Esto evita que las coordenadas de sombra se indexen fuera del mapa de sombras.
Cara trasera y cara frontal
Los mapas de sombras deben representarse con la selección estándar de la cara trasera, un proceso que omite la rasterización de objetos que el visor no puede ver y acelera la representación de la escena. Otra opción común es representar mapas de sombras con la selección de cara frontal habilitada, lo que significa que se eliminan los objetos orientados al visor. El argumento de esto es que ayuda con el sombreado propio, ya que la geometría que constituye la copia de seguridad de los objetos es ligeramente desplazada. Hay dos problemas con esta idea.
- Cualquier objeto con geometría frontal o cara trasera incorrecta provoca artefactos en el mapa de sombras. Sin embargo, tener geometría frontal o trasera incorrecta provocará otros problemas, por lo que puede ser seguro asumir que la geometría frontal y trasera se realiza correctamente. Puede ser poco práctico crear caras traseras para geometría basada en sprite, como follaje.
- Peter Panning y espacios de sombra cerca de la base de objetos como paredes son más probables que se produzcan porque la disparidad de profundidad de sombra es demasiado pequeña.
Mapa de sombras: geometría fácil de usar
La creación de geometría que funciona bien en mapas de sombras permite una mayor flexibilidad al combatir artefactos como Peter Panning y el acné de sombra.
Los bordes duros son problemáticos para el sombreado propio. La disparidad de profundidad cerca de la punta del borde es muy pequeña. Incluso un desplazamiento pequeño puede hacer que los objetos pierdan sus sombras (Figura 18).
Figura 18. Los bordes afilados provocan artefactos derivados de la disparidad de baja profundidad con desplazamientos
Los objetos estrechos, como las paredes, deben tener espaldas incluso si nunca son visibles. Esto aumentará la disparidad de profundidad.
También es importante asegurarse de que la dirección a la que se enfrenta la geometría es correcta; es decir, el exterior de un objeto debe estar hacia atrás y el interior de un objeto debe estar orientado hacia delante. Esto es importante para la representación con la selección de la cara trasera habilitada, así como para combatir los efectos del sesgo de profundidad.
Resumen
Las técnicas descritas en este artículo se pueden usar para aumentar la calidad de los mapas de sombras estándar. El siguiente paso es examinar las técnicas que pueden funcionar bien con mapas de sombras estándar. Los CSM se recomiendan como una técnica superior para combatir el alias de perspectiva. El filtrado o la varianza de los mapas de sombras de porcentaje más cercanos se pueden usar para suavizar los bordes de la sombra. Consulte el artículo técnico Sobre mapas de sombras en cascada para obtener más información.
Donnelly, W., y Lauritzen, A. Mapas de sombras de varianza. Simposio sobre gráficos 3D interactivos, Actas del Simposio de 2006 sobre gráficos y juegos 3D interactivos. 2006, pp. 161–165.
Engel, Woflgang F. Sección 4. Mapas de sombras en cascada. ShaderX5, Advanced Rendering Techniques, Wolfgang F. Engel, Ed. Charles River Media, Boston, Massachusetts. 2006. pp. 197–206.
Stamminger, Marc y Drettakis, George. Mapas de sombras de perspectiva. Conferencia Internacional sobre Gráficos Informáticos y Técnicas Interactivas, Actas de la 29ª Conferencia Anual sobre Gráficos Informáticos y Técnicas Interactivas. 2002, pp 557–562.
Wimmer, M., Scherzer, D., y Purgathofer, W. Light Space Perspective Shadow Maps. Simposio eurográfico sobre representación. 2004. Revisado el 10 de junio de 2005. Technische Universität Wien.