Envisagez un éclairage différé. En résumé, l'éclairage différé est une technique qui utilise une version réduite de l'ombrage différé pour calculer une image lumineuse de l'espace d'écran. Dans un deuxième passage, la géométrie est à nouveau rendue en utilisant le plan lumineux de l'espace d'écran comme information d'éclairage.
Cette technique est utilisée pour réduire la taille du G-Buffer, car moins d'attributs sont nécessaires. Cela vous offre également l'avantage que le G-Buffer et le lightmap de l'espace d'écran peuvent être de résolution inférieure à celle de l'écran.
J'avais implémenté un rendu basé sur GLES 2.0 strict (bien qu'expérimental), et j'ai réussi à réduire le G-Buffer à une seule texture RGBA (oui, j'ai utilisé une texture2D au lieu d'un renduerbuffer). Il contenait la carte normale de l'espace d'écran + le tampon de profondeur dans le canal alpha (qui a été compressé à l'aide d'un logarithme, pour autant que je m'en souvienne).
Les attributs de position (appelés ici monde ) peuvent être calculés lors du passage d'éclairage en utilisant le fait que, dans une projection perspective, .xy est divisé par .z , de sorte que:
x yFr u s t u m= x yw o r l d/ zw o r l d
J'ai approximé le xy de l'attribut position en faisant:
x yw o r l d= x yFr u s t u m∗ zw o r l d
Remarque: J'ai dû faire d'autres ajustements en fonction des paramètres de la matrice de projection.
Il convient également de noter que j'étais capable d'omettre la composante .z des vecteurs normaux, car je pouvais reconstruire .z à partir de .xy car le vecteur normal est normalisé de sorte que:
X2+ y2+ z2----------√= 1X2+y2+z2= 1z2= 1 - (x2+y2)z= 1 - ( x2+ y2)-----------√
En utilisant cette technique, j'ai pu libérer un autre canal dans mon RGBA G-Buffer et l'ai utilisé pour stocker la carte spéculaire de l'espace d'écran (ou la brillance, si vous voulez).