Considere la iluminación diferida. En pocas palabras, la iluminación diferida es una técnica que utiliza una versión reducida de sombreado diferido para calcular un mapa de luz del espacio de pantalla. En una segunda pasada, la geometría se representa nuevamente utilizando el mapa de luz del espacio de pantalla como información de iluminación.
Esta técnica se utiliza para reducir el tamaño del G-Buffer, ya que se necesitan menos atributos. También le ofrece la ventaja de que el G-Buffer y el mapa de luz del espacio de pantalla pueden ser de menor resolución que la pantalla.
Había implementado un renderizador estricto basado en GLES 2.0 (aunque experimental), y logré reducir el G-Buffer a una textura RGBA (sí, usé una texture2D en lugar de un renderbuffer). Contenía el mapa normal del espacio de pantalla + el búfer de profundidad en el canal alfa (que estaba comprimido usando un logaritmo, hasta donde recuerdo).
Los atributos de posición (llamados mundo aquí) se pueden calcular durante el pase de iluminación utilizando el hecho de que, en una proyección en perspectiva, .xy se divide por .z , de modo que:
x yFr U st u m=x yw o rl d/ / zw o r l d
Aproximé el atributo de posición xy haciendo:
x yw o r l d= x yFr u s t u m∗ zw o r l d
Nota: Tuve que hacer más ajustes dependiendo de la configuración de la matriz de proyección.
También vale la pena señalar que fui capaz de omitir el componente .z de los vectores normales, ya que podría reconstruir .z a partir de .xy ya que el vector normal está normalizado de modo que:
X2+ y2+ z2----------√= 1X2+ y2+ z2= 1z2= 1 - ( x2+ y2)z= 1 - ( x2+ y2)-----------√
Usando esta técnica, pude liberar otro canal en mi RGBA G-Buffer y lo usé para almacenar el espacio especular del mapa especular (o brillo, si lo desea).