Escuché sobre el renderizado diferido y cómo usarlo puede permitir "muchas" luces en una escena sin un gran impacto en el rendimiento, pero ¿qué es y (desde un alto nivel) cómo se implementa?
fuente
Escuché sobre el renderizado diferido y cómo usarlo puede permitir "muchas" luces en una escena sin un gran impacto en el rendimiento, pero ¿qué es y (desde un alto nivel) cómo se implementa?
La característica definitoria de la representación diferida es que esencialmente cambia la complejidad de la representación de la escena de O (geometría * luces) a O (geometría + luces).
Esto se logra renderizando primero la escena usando sombreadores diseñados para generar atributos básicos como (como mínimo) posición *, color normal y difuso. Otros atributos pueden incluir valores especulares por píxel y otras propiedades del material. Estos se almacenan en objetivos de representación en pantalla completa, conocidos colectivamente como G-buffer.
(*: Vale la pena señalar que los desarrolladores optarán más comúnmente por almacenar profundidad y usarla para reconstruir la posición, ya que tener profundidad disponible es útil para tantos otros efectos ) .
Una vez que se ha generado el G-buffer, es posible calcular un resultado completamente iluminado para cualquier píxel en la pantalla resolviendo el BRDF exactamente una vez por píxel por luz. En otras palabras, si tiene 20 mallas cada una afectada por 20 luces, el renderizado tradicional ("hacia adelante") exigiría que vuelva a renderizar cada malla varias veces para acumular el resultado de cada luz que la afecta. En el peor de los casos, esto sería una llamada de sorteo por malla por luz, ¡o 400 llamadas de sorteo en total! Para cada una de estas llamadas de sorteo, está volviendo a transformar redundantemente los vértices de la malla. También hay una buena posibilidad de que esté sombreando píxeles que en realidad no se ven afectados por la luz o que no serán visibles en el resultado final (porque estarán ocluidos por otra geometría en la escena). Cada uno de estos resultados desperdicia recursos de GPU
Compare con el renderizado diferido: solo tiene que renderizar las mallas una vez para llenar el G-buffer. Después de eso, para cada luz, representa una forma delimitadora que representa la extensión de la influencia de la luz. Para un punto de luz, esta podría ser una esfera pequeña, o para una luz direccional, sería un quad de pantalla completa, ya que la escena completa se ve afectada.
Luego, cuando ejecuta el sombreador de píxeles / fragmentos para el volumen delimitador de esa luz, lee los atributos de geometría desde la posición adecuada en las texturas del G-buffer y usa esos valores para determinar el resultado de la iluminación. Solo los píxeles de la escena que son visibles en el resultado final están sombreados, y están sombreados exactamente una vez por luz. Esto representa un ahorro potencialmente enorme.
Sin embargo, no está exento de inconvenientes. Es un paradigma que es muy difícil de extender para manejar geometría transparente (ver: pelado de profundidad). Tan difícil, de hecho, que prácticamente todas las implementaciones de renderizado diferido recurren al renderizado hacia adelante para las partes transparentes de la escena. El renderizado diferido también consume una gran cantidad de VRAM y ancho de banda de búfer de trama, lo que lleva a los desarrolladores a hacer grandes esfuerzos para empaquetar y comprimir inteligentemente los atributos de G-buffer en los componentes más pequeños / menos posibles.
También conocido como sombreado diferido, el renderizado diferido se refiere a un amplio conjunto de posibles rutas de renderizado que almacenan resultados intermedios en texturas, luego completa la ecuación de renderizado más tarde muestreando los datos intermedios.
Los buffers de geometría son un ejemplo temprano, donde la escena se renderiza en una serie de buffers que contienen, por ejemplo, la posición, la textura normal y la base de la geometría opaca. La iluminación no se ha aplicado y se desconoce el color final. En pasadas posteriores, las luces se procesan y se muestran muestras de los buffers de geometría. Esto significa que se puede representar un gran número de luces con un costo fijo del número de luces posiblemente visibles en un píxel de la pantalla. El renderizado tradicional habría evaluado todas las fuentes de luz en busca de superficies ocluidas y nunca vistas en la pantalla.
Existen muchas variaciones, incluida la representación de información ligera primero, por ejemplo.
Consulte para obtener más información: http://en.wikipedia.org/wiki/Deferred_shading http://delicious.com/aancsiid/deferred-shading
El renderizado diferido es el procesamiento donde está la geometría antes de hacer una segunda pasada para sombrear todo. Es útil porque cambia la coplexidad a O (píxeles * fuentes de luz), lo que le permite usar escenas complejas con solo un pequeño impacto en el rendimiento.
Implementarlo es bastante simple. La primera pasada requiere renderizar, como mínimo, la distancia, la normalidad y el color. Puede agregar más texturas para renderizar como especular y posición, a costa de la memoria.
Una vez que los haya renderizado, renderiza algunas esferas, donde una fuente de luz única está en el centro de cada una, agrega la luz, recorta todo a la geometría de su escena y, finalmente, aplica la caída.
there's the correct complexity equation
Cierto. Pero yo diría que es un detalle menor. Puede sugerir eso como una edición a la otra respuesta, o dejar un comentario al respecto una vez que tenga suficiente reputación. Hacer una nueva respuesta por eso es un poco exagerado.it's much more concise
Personalmente no creo que sea bueno. Cuantos más detalles útiles tenga una respuesta, mejor será, ¿no?