Esta página detalla el Legacy Deferred Lighting (light prepass) rendering path. Consulte este artículo para obtener una descripción técnica de la iluminación diferida.
Nota: Deferred Lighting se considera una característica legacy que comienza con Unity 5.0, ya que no admite algunas de las características de rendering (por ejemplo, Standard shader, reflection probes). Los nuevos proyectos deben considerar el uso del Deferred Shading rendering path en su lugar.
NOTA: El Deferred rendering no es compatible con la proyección ortográfica. Si el modo de proyección de la cámara está ajustado a Ortográfico, la cámara utilizará siempre el Forward rendering.
Cuando se utilice Deferred Lighting, no hay límite en la cantidad de luces que pueden afectar a un objeto. Todas las luces son evaluadas por píxel, lo que significa que todos interactúan correctamente con normal maps, etc. Además, todas las luces pueden tener cookies y sombras.
La Deferred lighting tiene la ventaja de que la sobrecarga de procesamiento de la iluminación es proporcional al número de píxeles que la luz brilla. Esto se determina por el tamaño del volumen de luz en la escena independientemente de cuántos objetos ilumina. Por lo tanto, el rendimiento se puede mejorar manteniendo las luces pequeñas. La Deferred lighting también tiene un comportamiento altamente consistente y predecible. El efecto de cada luz se calcula por píxel, por lo que no hay cálculos de iluminación que se descomponen en grandes triángulos.
En el lado negativo, la iluminación diferida no tiene soporte real para el anti-aliasing y no puede manejar objetos semitransparentes (estos se renderizarán utilizando el forward rendering). También no hay soporte para la flag Receive Shadows y las culling masks sólo se admiten de forma limitada. Sólo puede usar hasta cuatro culling masks. Es decir, su culling layer mask debe por lo menos contener todas las capas menos cuatro capas arbitrarias, por lo que 28 de las 32 capas se deben establecer. De lo contrario obtendrá artefactos gráficos.
Requiere una tarjeta gráfica con Shader Model 3.0 (o posterior), soporte para Depth render textures y buffers de doble cara stencil. La mayoría de las tarjetas gráficas de PC hechas después de 2004 apoyan la iluminación diferida, incluyendo GeForce FX y más adelante, Radeon X1300 y más adelante, Intel 965 / GMA X3100 y posteriores. En móvil, todas las GPU compatibles con OpenGL ES 3.0 admiten iluminación diferida, y algunas de OpenGL ES 2.0 son compatibles también (los que soportan texturas de profundidad).
La sobrecarga de rendering de luces en tiempo real en iluminación diferida es proporcional al número de píxeles iluminados por la luz y no depende de la complejidad de la escena. Por lo tanto, las point o spot lights pequeñas son muy baratas de procesar y si son totalmente o parcialmente ocluidas por objetos de escena, entonces son aún más baratas.
Por supuesto, las luces con sombras son mucho más caras que las luces sin sombras. En iluminación diferida, los objetos de proyección de sombras todavía necesitan ser renderizados una vez o más para cada luz que emita sombras. Además, el lighting shader que aplica sombras tiene una sobrecarga de renderizado más alta que la utilizada cuando las sombras están desactivadas.
Cuando se usa Iluminación Diferida, el proceso de renderización en Unity ocurre en tres pases:
Los objetos con shaders que no pueden manejar la iluminación diferida se renderizan después de que este proceso se haya completado, utilizando la ruta forward rendering.
El pase base procesa cada objeto una vez. Las vistas de espacio normales y de poder especular se representan en un solo ARGB32 Render Texture (con normales en canales RGB y potencia especular en A). Si la plataforma y el hardware permiten que el búfer Z se lea como una textura, entonces la profundidad no se renderiza explícitamente. Si no se puede acceder al búfer Z como una textura, la profundidad se renderiza en un pase de representación adicional usando shader replacement.
El resultado del base pass es un buffer Z lleno del contenido de la escena y una Render Texture con normales y potencia especular.
El paso de iluminación calcula la iluminación basada en la profundidad, las normales y la potencia especular. La iluminación se calcula en el espacio de la pantalla, por lo que el tiempo que tarda en procesarse es independiente de la complejidad de la escena. El búfer de iluminación es una única Render Texture ARGB32 , con iluminación difusa en los canales RGB y iluminación especular monocromática en el canal A. Los valores de iluminación se codifican logarítmicamente para proporcionar un mayor rango dinámico de lo que suele ser posible con una textura ARGB32. Cuando una cámara tiene habilitada la renderización HDR, el búfer de iluminación es de formato ARGBHalf y no se realiza la codificación logarítmica.
Las point y spot lights que no cruzan el plano cercano de la cámara se render como (caras frontales de) formas 3D, con la prueba de profundidad contra la escena habilitada. Las luces que cruzan el plano cercano también se render usando formas 3D, pero como caras traseras con la prueba de profundidad invertida en su lugar. Esto hace que las luces parcial o totalmente ocluidas sean muy baratas de procesar. Si una luz corta los planos de la cámara lejanos y cerca al mismo tiempo, no se pueden utilizar las optimizaciones anteriores y la luz se dibuja como un cuadrángulo apretado sin pruebas de profundidad.
Lo de arriba no aplica a directional lights, que siempre está renderizadas como quads de pantalla completa.
Si una luz tiene sombras activadas, entonces también se renderizan y aplican en este paso. Observe que las sombras no vienen “gratis”; Se necesitan renderizadores de sombra y se debe aplicar un sombreado de luz más complejo.
El único modelo de iluminación disponible es Blinn-Phong. Si se desea un modelo diferente, puede modificar el sombreado de paso de iluminación colocando la versión modificada del archivo Internal PrePassLighting.shader en shaders integrados en una carpeta llamada “Resources” en su carpeta “Assets”. Luego vaya a la ventana Edit->Project Settings->Graphics . Cambió la lista desplegable “Legacy Deferred” a “Custom Shader”. A continuación, cambie la opción Shader que aparece en el sombreado de iluminación que está utilizando.
El pase final produce la imagen renderizada final. Aquí todos los objetos se vuelven a renderizar con shaders que buscan la iluminación, la combinan con texturas y añaden cualquier iluminación emisiva. Los mapas de luz también se aplican en el paso final. Cerca de la cámara, la iluminación en tiempo real se utiliza, y sólo se añade luz indirecta al horno. Este crossfade en la iluminación completamente cocida alejado de la cámara.