Sombreado diferido
# Sombreado diferido

En el campo de gráficos 3D por computadora, deferred shading, o, en español, sombreado diferido, es una técnica de sombreado a nivel de pantalla. Se le llama diferida porque el sombreado no es hecho en el primer pase de shaders a los vértices y píxeles; sino es «diferido» hasta un segundo pase.

En el primer pase de un deferred shader, solo la información que es requerida para computación de sombreado es reunida. Las posiciones, normales, y materiales para cada superficie son pasados al buffer de geometría (G-buffer) en forma de texturas. Después de esto, un shader de píxeles computa la luz directa e indirecta en cada píxel utilizando la información de los buffers de textura, en espacio de pantalla.

La oclusión direccional en el espacio de la pantalla puede ser hecha como del parte del segmento del deferred shading para dar dirección a las sombras e interreflexiones.

## Ventajas

La ventaja primaria del deferred shading es el desacoplamiento de la geometría de escena y la iluminación. Un solo pase a la geometría es requerido y cada luz es computada solo para los píxeles que afecta. Esto da la capacidad de mostrar muchas luces en una escena sin un impacto al rendimiento significativo. Otras ventajas en esta técnica pueden incluir una administración más simple de una iluminación compleja, más facilidad de gestionar otros shaders y la simplificación de la segmentación del software para el rendering.

## Desventajas

Una desventaja clave de deferred rendering es la incapacidad para manejar la transparencia dentro del algoritmo, a pesar de que este problema es parte de escenas hechas con un Z-buffer y suele ser arreglado retrasando y ordenando el rendering por las porciones transparentes de la escena. La técnica depth peeling puede conseguir transparencia de orden independiente en el deferred rendering, pero esto crea batches adicionales aumenta la medida del G-buffer. Hardware moderno que soporta DirectX 10 o más reciente, es usualmente capaz de usar batches bastante rápido como para mantener los cuadros por segundo a un nivel aceptable. Cuando la transparencia de orden independiente es necesitada (generalmente para aplicaciones del consumidor), el deferred shading no es menos eficaz que el forward shading utilizando la misma técnica.

Otra desventaja importante es la dificultad cuando se utilizan múltiples materiales; es posible de utilizar muchos materiales diferentes, pero estos requieren que más información sea almacenada en el G-buffer, que ya es bastante grande y usa una cantidad grande de memoria.

Otra desventaja todavía más importante es que debido a la separación de la etapa de iluminación y de la etapa geométrica, el anti-aliasing no produce resultados correctos ya que los resultados interpolados terminan con atributos de posiciones, normales, y tangentes que no tienen sentido. Una de las técnicas habituales para compensar esta limitación es la de utilizar la detección de borde en la imagen final y luego aplicar blur sobre los bordes, sin embargo recientemente han sido desarrolladas técnicas para el proceso suavizando de los bordes que funcionan después del proceso, tales como MLAA (usada en Killzone 3 y Dragon Age II, entre otros), FXAA (usada en Crysis 2, FEAR 3, Duke Nukem Forever), SRAA, DLAA (usadas en Star Wars: The Force Unleashed II), y MSAA (usadaen Crysis 2 como anti-aliasing predeterminada). A pesar de no ser una técnica que suaviza los bordes, el anti-aliasing temporal (utilizado en Halo Reach) también puede dar a los bordes un aspecto más suave. DirectX 10 introdujo características que permiten que shaders accedan muestras individuales de los objetivos (y buffers de profundidad en la versión 10.1), dándole a los usuarios de este API acceso al anti-aliasing del hardware al usar el deferred shading. Esta característica también permite correctamente aplicar un mapeo de la luminancia HDR a los bordes con anti-aliasing, defiriendo de las versiones más tempranas del API en donde el beneficio del anti-aliasing podía haberse perdido.

## Iluminación diferida

Deferred lighting, o iluminación diferida, es una modificación del deferred shading. Esta técnica utiliza tres pases, en vez de los dos en el deferred shading. En el primer pase sobre la geometría de escena, solo los atributos necesarios para computar la iluminación de los píxeles (irradiancia) son guardados al G-Buffer. En el espacio de la pantalla, el pase diferido produce data solo de los valores difusos y especular, así un segundo pase tiene que ser realizado sobre la escena para leer los datos de la iluminación y luego producir el sombreo final. La ventaja aparente del deferred lighting es una reducción dramática en el tamaño del G-Buffer. El coste obvio es la necesidad calcular la geometría de escena dos veces en vez de una sola. Otro coste adicional es que el pase diferido debe producir irradiancia difusa y especular por separado, mientras que el pase diferido en deferred shading necesita producir solo un único valor de radiancia combinado.

Debido a la reducción de la medida del G-buffer esta técnica parcialmente puede superar una desventaja seria del deferred shading: materiales múltiples. Otro problema que puede ser solucionado es MSAA. Deferred lighting puede ser utilizado con MSAA en DirectX 9.

## Deferred lighting en juegos comerciales

El uso de la técnica ha aumentado en videojuegos debido al control que esta habilita al poder utilizar una cantidad grande de luces dinámicas y por reducir la complejidad instrucciones del shader requeridas. Algunos ejemplos de juegos que usan deferred lighting son:

* Alan Wake
* Assassin's Creed III
* Bioshock Infinite
* Blur
* Brink
* Crackdown y Crackdown 2
* Crysis 2
* Dead Space, Dead Space 2 y Dead Space 3
* Deus Ex: Human Revolution
* Dragon's Dogma
* Guild Wars 2
* Halo: Reach
* inFamous y inFamous 2
* LittleBigPlanet
* Metal Gear Solid V: Ground Zeroes
* Metal Gear Solid V: The Phantom Pain
* Shift 2 UNLEASHED
* Red Dead Redemption
* Resistance (serie)
* Rochard
* StarCraft II
* Uncharted y Uncharted 2
* Vanquish

## Deferred shading en juegos comerciales

En comparación a deferred lighting, esta técnica no es muy popular debido a la necesidad de memoria y los requisitos de ancho de banda. Especialmente en consolas, donde la memoria gráfica y el ancho de banda son limitados.

* Amnesia: The Dark Descent
* Battlefield 3
* Dota 2
* Dungeons
* Grand Theft Auto IV
* Killzone 2 y Killzone 3
* Mafia 2
* Miner Wars 2081
* Metro 2033
* Rift
* Shrek
* Splinter Cell: Conviction
* Stalker: Shadow of Chernobyl, Clear Sky y Call of Pripyat
* Tabula Rasa
* Trine
* Trine 2
* Viva Pinata

## Técnicas diferidas en motores

* Torque 3D
* CryEngine 3
* I-Novae
* Unity
* Frostbite 2
* Unreal Engine 3
* Unreal Engine 4
* Chrome Engine
* MT Framework
* GameStart
* Source
* Fox Engine
* Leadwerks Engine
* Rockstar Advanced Game Engine
* Havok Vision Engine

## Historia

La idea de deferred shading fue originalmente introducida por Michael Deering y sus colegas en un papel publicado en 1988 titulado The triangle processor and normal vector shader: a VLSI system for high performance graphics. A pesar de que el papel nunca utiliza la palabra «diferido», el concepto clave es introducido; cada píxel es sombreado solo una vez después de la resolución de profundidad. Deferred shading tal como lo sabemos hoy, utilizando G-buffers, fue introducido en un papel por Saito y Takahashi en 1990, a pesar de que también no utilizan la palabra «diferido». El primer videojuego con deferred shading fue Shrek, un título para la Xbox lanzado en 2001. Alrededor del año 2004, implementaciones en hardware de gráficos empezaron a aparecer. La técnica obtuvo popularidad más tarde para aplicaciones como videojuegos, finalmente volviéndose convencional del 2008 a 2010.

