Prendi in considerazione l'illuminazione differita. In breve, l'illuminazione differita è una tecnica che utilizza una versione ridotta dell'ombreggiatura differita per calcolare una mappa luminosa dello spazio. In un secondo passaggio, la geometria viene nuovamente renderizzata utilizzando la mappa luminosa dello spazio come informazioni di illuminazione.
Questa tecnica viene utilizzata per ridurre le dimensioni del G-Buffer, poiché sono necessari meno attributi. Ti offre anche il vantaggio che G-Buffer e la mappa luminosa dello spazio dello schermo possono avere una risoluzione inferiore rispetto allo schermo.
Avevo implementato un rigoroso renderer basato su GLES 2.0 (sebbene sperimentale) e sono riuscito a far bollire il G-Buffer fino a una trama RGBA (sì, ho usato un texture2D invece di un renderbuffer). Conteneva la normale mappa dello spazio dello schermo + il buffer di profondità nel canale alfa (che è stato compresso usando un logaritmo, per quanto mi ricordo).
Gli attributi di posizione ( qui chiamati mondo ) possono essere calcolati durante il passaggio di illuminazione usando il fatto che in una proiezione prospettica, .xy è diviso per .z , in modo che:
x yfr u s t u m= x yw o r l d/ zw o r l d
Ho approssimato l'attributo position xy facendo:
x yw o r l d= x yfr u s t u m∗ zw o r l d
Nota: ho dovuto effettuare ulteriori regolazioni a seconda delle impostazioni della matrice di proiezione.
Vale anche la pena notare che sono stato in grado di omettere il componente .z dei vettori normali, poiché ho potuto ricostruire .z da .xy poiché il vettore normale è normalizzato in modo che:
X2+ y2+ z2----------√= 1X2+ y2+ z2= 1z2= 1 - ( x2+ y2)z= 1 - ( x2+ y2)-----------√
Usando questa tecnica, sono stato in grado di liberare un altro canale nel mio G-Buffer RGBA e l'ho usato per memorizzare la mappa speculare dello spazio dello schermo (o lucentezza, se vuoi).