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[2] 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.[3] 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.[4] 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.[5]
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[6] (usada en Crysis 2, FEAR 3, Duke Nukem Forever), SRAA, DLAA[7] (usadas en Star Wars: The Force Unleashed II), y MSAA[8] (usadaen Crysis 2 como anti-aliasing predeterminada).[9][10] 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.[7] 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.[11] 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[12]
- Bioshock Infinite[13]
- Blur
- Brink
- Crackdown y Crackdown 2[14]
- Crysis 2[15]
- Dead Space,[16] Dead Space 2[17] y Dead Space 3[18]
- Deus Ex: Human Revolution [19]
- Dragon's Dogma [20]
- Guild Wars 2 [21]
- Halo: Reach [22]
- inFamous y inFamous 2
- LittleBigPlanet
- Metal Gear Solid V: Ground Zeroes
- Metal Gear Solid V: The Phantom Pain[23]
- Shift 2 UNLEASHED [24]
- Red Dead Redemption
- Resistance (serie)[25]
- Rochard
- StarCraft II [26]
- Uncharted y Uncharted 2[27]
- Vanquish [28]
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[29]
- Battlefield 3[30]
- Dota 2[31]
- Dungeons
- Grand Theft Auto IV
- Killzone 2 y Killzone 3[32]
- Mafia 2
- Miner Wars 2081[33]
- Metro 2033[34]
- Rift
- Shrek[35]
- Splinter Cell: Conviction
- Stalker: Shadow of Chernobyl, Clear Sky y Call of Pripyat[36]
- Tabula Rasa[37]
- Trine[38]
- Trine 2 [39]
- Viva Pinata
Técnicas diferidas en motores
- Torque 3D[40]
- CryEngine 3[41]
- I-Novae[42]
- Unity[43]
- Frostbite 2[44]
- Unreal Engine 3[45]
- Unreal Engine 4[46]
- Chrome Engine
- MT Framework
- GameStart[47]
- Source[48]
- Fox Engine[23]
- Leadwerks Engine[49]
- Rockstar Advanced Game Engine[50]
- Havok Vision Engine[51]
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.[52] 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».[53] El primer videojuego con deferred shading fue Shrek, un título para la Xbox lanzado en 2001.[54] Alrededor del año 2004, implementaciones en hardware de gráficos empezaron a aparecer.[55] La técnica obtuvo popularidad más tarde para aplicaciones como videojuegos, finalmente volviéndose convencional del 2008 a 2010.[49]
Referencias
- ↑ http://http.download.nvidia.com/developer/presentations/2004/6800_Leagues/6800_Leagues_Deferred_Shading.pdf
- ↑ "Deferred Screen Space Directional Occlusion". kayru.org.
- ↑ «Copia archivada». Archivado desde el original el 13 de agosto de 2013. Consultado el 14 de noviembre de 2015.
- ↑ <"NVIDIA SDK 9.51 - Featured Code Samples".
- ↑ Wolfgang Engel.
- ↑ «Copia archivada». Archivado desde el original el 25 de noviembre de 2011. Consultado el 7 de noviembre de 2011.
- ↑ a b Dmitry Andreev.
- ↑ http://igm.univ-mlv.fr/~biri/mlaa-gpu/TMLAA.pdf
- ↑ "Deferred shading tutorial" (PDF).
- ↑ <"Subpixel Reconstruction Antialiasing". nvidia.com.
- ↑ "Real-Time Rendering · Deferred lighting approaches". realtimerendering.com.
- ↑ "Assassin's Creed III: The Redesigned Anvil Engine". www.
- ↑ "Bioshock Infinite development is PS3 focused and uses Uncharted 2 tech" Archivado el 3 de octubre de 2011 en Wayback Machine.. blorge.com.
- ↑ "Tech Interview: Crackdown 2".
- ↑ guest11b095.
- ↑ "Dead Space by Electronic Arts".
- ↑ "Face-Off: Dead Space 2"
- ↑ "Face-Off: Dead Space 3"
- ↑ "Google Translate". google.com
- ↑ "GregaMan > Manage Blog". capcom-unity.com.
- ↑ "Normals".
- ↑ "Tech Interview: Halo: Reach".
- ↑ a b "Tech Analysis: Metal Gear Solid 5's FOX Engine".
- ↑ "The Making of Shift 2 Unleashed Article • Page 2 • Eurogamer.net".
- ↑ «Copia archivada». Archivado desde el original el 15 de septiembre de 2011. Consultado el 12 de julio de 2011.
- ↑ "StarCraft II Effects & techniques" (PDF).
- ↑ "CGSociety Maintenance" Archivado el 2 de abril de 2015 en Wayback Machine.. cgsociety.org.
- ↑ "Deferred Rendering « PlatinumGames Inc." Archivado el 27 de noviembre de 2010 en Wayback Machine.. platinumgames.com.
- ↑ Silard Šimon.
- ↑ DICE.
- ↑ "Valve Developer Wiki - Dota 2"
- ↑ «Copia archivada». Archivado desde el original el 11 de julio de 2011. Consultado el 2 de diciembre de 2010.
- ↑ Miner Wars 2081
- ↑ "Tech Interview: Metro 2033 Interview • Page 2 • Eurogamer.net"
- ↑ "History - Electric Sheep Games"
- ↑ Shishkovtsov, Oles (2005-03-07).
- ↑ <"Deferred shading in Tabula Rasa" Archivado el 3 de febrero de 2009 en Wayback Machine..
- ↑ "Steam Users' Forums - View Single Post - Taking the Physx load off the CPU...". steampowered.com.
- ↑ "Steam Users' Forums - View Single Post - Trine 2 rendering information - anti-aliasing, overheating, stereo, input lag, etc". steampowered.com.
- ↑ "Torque 3D Development - Advanced Lighting (deferred lighting hybrid)". 2009-03-03
- ↑ "CryENGINE 3 Specifications".
- ↑ "Infinity Development Journal – Deferred Lighting".
- ↑ Vosburgh, Ethan (2010-09-09).
- ↑ "Lighting you up in Battlefield 3" Archivado el 25 de agosto de 2011 en Wayback Machine..
- ↑ "Unreal Engine 3 Showcase - Samaritan" Archivado el 19 de junio de 2012 en Wayback Machine..
- ↑ "Unreal Engine 4 - Rendering Overview".
- ↑ http://gamestart3d.com/feature_list/ Archivado el 2 de diciembre de 2011 en Wayback Machine. "GameStart – Feature List"].
- ↑ "Deferred lighting - Alien Swarm SDK". 2012-05-29
- ↑ a b Klint, Josh.
- ↑ "BUILD: Deferred rendering". 2009-02-26.
- ↑ "Vision Engine 8.2 Brings 3D Technologies Cross-Platform" Archivado el 16 de noviembre de 2012 en Wayback Machine.. 2011-10-10
- ↑ Deering, Michael; Stephanie Winner; Bic Schediwy; Chris Duffy; Neil Hunt.
- ↑ Saito, Takafumi; Tokiichiro Takahashi (1990).
- ↑ Geldreich, Rich.
- ↑ "Deferred Shading" (PDF).