06/06/2023
La pregunta sobre si los mapas de sombras (shadow maps) pueden ser utilizados en un pipeline de renderizado diferido (deferred shading) es fundamental para entender la evolución de los gráficos en tiempo real. La respuesta es un rotundo sí. De hecho, no solo son compatibles, sino que forman una de las sinergias más potentes en el renderizado moderno, permitiendo escenas con una cantidad masiva de luces dinámicas y sombras complejas sin sacrificar el rendimiento. El deferred shading desacopla el coste de la iluminación de la complejidad geométrica de la escena, y los shadow maps se integran de manera natural en este proceso, aprovechando la información ya calculada para determinar qué píxeles están en sombra. El motor del videojuego S.T.A.L.K.E.R. es un caso de estudio paradigmático, ya que fue uno de los pioneros en basar toda su arquitectura de renderizado en esta técnica para lograr un mundo completamente dinámico.

¿Qué es Exactamente el Deferred Shading?
Para apreciar por qué los shadow maps funcionan tan bien aquí, primero debemos entender el concepto central del deferred shading. En el renderizado tradicional, conocido como forward rendering, cada objeto se renderiza y se le aplica la iluminación de todas las luces que lo afectan en una sola pasada (o en múltiples pasadas por cada luz). Si tienes 100 objetos y 10 luces, el número de cálculos puede explotar rápidamente, especialmente si muchos de esos objetos se superponen en la pantalla (overdraw).
El deferred shading invierte este proceso y lo divide en dos fases principales:
- Pase Geométrico (G-Buffer Creation): En esta primera fase, la escena se renderiza sin ninguna información de iluminación. En lugar de calcular el color final, los shaders de píxeles escriben atributos geométricos de la superficie en una serie de texturas de pantalla completa. Este conjunto de texturas se conoce colectivamente como el G-buffer (Geometry Buffer). Típicamente, el G-buffer almacena información como:
- La posición del píxel en el espacio del mundo o de la vista.
- La normal de la superficie en ese píxel.
- El color base (albedo) y el brillo especular (gloss).
- Índices de material u otros datos personalizados.
- Pase de Iluminación (Lighting Pass): Una vez que el G-buffer está completo, la iluminación se calcula como un post-proceso en 2D. Para cada luz en la escena, se dibuja una forma geométrica que representa su volumen de influencia (por ejemplo, una esfera para una luz de punto). El shader de píxeles para esta forma lee los datos del G-buffer y calcula la contribución de la luz para cada píxel afectado. El resultado es que el coste de la iluminación ya no depende de cuántos triángulos atraviesa una luz, sino de cuántos píxeles cubre en la pantalla.
La Sinergia Perfecta: Integrando Shadow Maps
Aquí es donde los shadow maps entran en juego de forma elegante. Un shadow map es, en esencia, una textura de profundidad renderizada desde la perspectiva de una luz. Contiene la distancia desde la luz hasta la superficie más cercana en cada dirección.
Durante el pase de iluminación del deferred shading, cuando se está calculando el color para un píxel específico, el shader ya tiene toda la información que necesita del G-buffer, incluida la posición exacta de ese píxel en el espacio del mundo. El proceso para aplicar la sombra es el siguiente:
- El shader transforma la posición del píxel del espacio del mundo al espacio de la luz.
- Con esta nueva coordenada, muestrea el shadow map para obtener la distancia almacenada (la distancia de la superficie más cercana a la luz).
- Compara esta distancia almacenada con la distancia actual del píxel a la luz.
- Si la distancia del píxel es mayor que la almacenada en el shadow map, significa que hay otro objeto entre el píxel y la luz. Por lo tanto, el píxel está en sombra y no recibe iluminación directa de esa fuente.
Esta integración es increíblemente eficiente porque evita la necesidad de renderizar la geometría de la escena de nuevo para cada luz durante el pase principal. El único coste adicional de geometría es la generación inicial de los shadow maps, que es un proceso bien optimizado en las GPUs modernas.
Optimizando las Sombras en un Entorno Diferido: El Caso de S.T.A.L.K.E.R.
El equipo de GSC Game World, al desarrollar S.T.A.L.K.E.R., se enfrentó al desafío de crear un mundo vasto con iluminación y sombras completamente dinámicas. Su implementación del deferred shading incluyó optimizaciones cruciales para el manejo de sombras, demostrando el potencial de la técnica.
Sombras Direccionales (El Sol)
Para una luz direccional como el sol, que afecta a toda la escena, el coste de calcular las sombras puede ser inmenso. La clave fue evitar el trabajo innecesario. Utilizaron el buffer de plantilla (stencil buffer) para marcar y descartar píxeles que no necesitaban el cálculo completo de sombras:
- El Cielo (Skybox): Los píxeles que pertenecen al cielo no necesitan sombreado ni sombras, ocupando a menudo un 30-40% de la pantalla en exteriores.
- Superficies no orientadas a la luz: Aproximadamente el 50% de los píxeles de una escena miran en dirección opuesta a la luz del sol. Estos pueden ser iluminados de forma más simple o solo con luz ambiental.
- Oclusión Ambiental (Ambient Occlusion): Si un píxel tiene un término de oclusión ambiental de cero (es decir, está en una grieta profunda), es imposible que los rayos del sol lo alcancen. Estos píxeles también pueden ser descartados.
Al realizar una pasada previa rápida para marcar estos casos en el stencil buffer, lograron que la GPU, gracias a su culling jerárquico, saltara el costoso shader de iluminación y filtrado de sombras en una gran porción de la pantalla, logrando aumentos de rendimiento de hasta 2x.
Sombras Omnidireccionales (Luces de Punto)
Las luces de punto, que emiten luz en todas las direcciones, son particularmente desafiantes. Se requiere una solución de 360 grados para sus sombras. Se evaluaron varias técnicas, cada una con sus pros y contras.
Tabla Comparativa de Técnicas de Sombreado Omnidireccional
| Técnica | Ventajas | Desventajas | Mejor para... |
|---|---|---|---|
| Cube Map | Conceptualmete simple. | Requiere 6 cambios de render target, difícil de empaquetar en un solo atlas, sin filtrado de hardware entre caras. | Implementaciones rápidas o cuando la flexibilidad no es una prioridad. |
| Seis Spotlights | Un solo cambio de render target, excelente para empaquetar, utiliza filtrado de hardware nativo, escalabilidad total. | Requiere un manejo cuidadoso de los bordes para evitar artefactos de filtrado. | El enfoque de máximo rendimiento y calidad en un pipeline de deferred shading. Fue la opción elegida para S.T.A.L.K.E.R. |
| Dual-Paraboloid Maps | Solo requiere dos pasadas de renderizado. | La proyección no lineal puede causar artefactos significativos y distorsiones, especialmente en deferred shading. | Escenarios donde el número de pasadas es la limitación principal. |
Tratar una luz de punto como seis luces de tipo foco (spotlights) alineadas con los ejes demostró ser la mejor opción para S.T.A.L.K.E.R. Aunque en forward rendering esto implicaría re-transformar la geometría seis veces, en deferred shading la geometría no se ve afectada; solo se generan los seis shadow maps y luego el pase de iluminación trata la luz como seis focos separados, lo cual es muy eficiente.

Mejoras de Calidad y Desafíos Adicionales
El deferred shading abre la puerta a técnicas avanzadas que mejoran la calidad visual, pero también presenta sus propios desafíos.
El Poder de la "Posición Virtual"
Técnicas como el parallax mapping simulan relieve en una superficie plana modificando las coordenadas de textura. Sin embargo, esto crea una disonancia visual: el relieve parece moverse, pero las sombras permanecen planas. La solución implementada fue la posición virtual. Durante el pase de iluminación, la posición del píxel leída del G-buffer se desplaza ligeramente a lo largo de su normal, en proporción al valor del mapa de altura. Este pequeño ajuste hace que las sombras interactúen con el relieve simulado, creando una sensación de profundidad mucho más convincente y, como efecto secundario, ayudando a mitigar artefactos comunes de los shadow maps como el "surface acne".
Desafíos Comunes: Transparencia y Antialiasing
El deferred shading no es una solución mágica y tiene dos debilidades notorias:
- Transparencia: El G-buffer solo puede almacenar información de una superficie por píxel (la más cercana a la cámara). Esto hace que el manejo de materiales transparentes o translúcidos sea imposible de forma directa. La solución común, utilizada también en S.T.A.L.K.E.R., es renderizar los objetos transparentes en una pasada separada usando forward rendering, después de que la escena opaca ha sido completamente iluminada.
- Antialiasing: El antialiasing por hardware tradicional (MSAA) funciona promediando muestras dentro de un píxel, pero solo para la geometría. En deferred shading, la iluminación se calcula una sola vez por píxel, por lo que el MSAA no tiene efecto sobre los bordes dentados causados por la iluminación (por ejemplo, el borde de una sombra). La solución pasa por algoritmos de antialiasing de post-proceso, como el FXAA o técnicas personalizadas que detectan discontinuidades en la profundidad y las normales (como se hizo en S.T.A.L.K.E.R.) para aplicar un desenfoque selectivo y suavizar los bordes.
Preguntas Frecuentes (FAQ)
¿Se pueden usar shadow maps con deferred shading?
Absolutamente. Es una de las combinaciones más eficientes y populares en los motores de juegos modernos para lograr iluminación y sombras dinámicas a gran escala. El G-buffer proporciona toda la información necesaria para que el muestreo de los shadow maps sea un proceso directo y rápido durante el pase de iluminación.
¿Por qué el deferred shading es más rápido con muchas luces?
Porque el coste de la iluminación se desacopla de la complejidad de la geometría. En lugar de calcular la iluminación para cada vértice o triángulo que una luz toca, el coste se vuelve proporcional al número de píxeles que la luz cubre en la pantalla. Esto significa que agregar cientos de luces pequeñas a una escena tiene un impacto de rendimiento mucho menor que en un motor de forward rendering.
¿Cuál es el mayor inconveniente del deferred shading?
Históricamente, sus dos mayores problemas son el manejo de la transparencia y la incompatibilidad con el antialiasing por hardware (MSAA). Ambos problemas requieren soluciones alternativas, como pases de renderizado adicionales para la transparencia y técnicas de antialiasing basadas en post-procesamiento.
¿Necesito una GPU muy moderna para implementar deferred shading?
El concepto básico de deferred shading es posible en hardware relativamente antiguo que soporte Múltiples Objetivos de Renderizado (MRT), como las GPUs de la era de DirectX 9. Sin embargo, para lograr un buen rendimiento y alta calidad, las GPUs modernas son cruciales. Ofrecen un mayor ancho de banda de memoria (esencial para leer y escribir en los G-buffers), formatos de textura más flexibles (como los de punto flotante de 16 o 32 bits para mayor precisión) y un rendimiento superior en los shaders, lo que permite cálculos de iluminación y sombreado más complejos.
Si quieres conocer otros artículos parecidos a Deferred Shading: Sombras Dinámicas y Rendimiento puedes visitar la categoría Juegos.
