Erwägen Sie eine verzögerte Beleuchtung. Kurz gesagt, die verzögerte Beleuchtung ist eine Technik, bei der eine reduzierte Version der verzögerten Schattierung verwendet wird, um eine Lightmap für den Bildschirmbereich zu berechnen. In einem zweiten Durchgang wird die Geometrie unter Verwendung der Screenspace-Lightmap als Beleuchtungsinformation erneut gerendert.
Diese Technik wird verwendet, um die Größe des G-Puffers zu reduzieren, da weniger Attribute benötigt werden. Sie haben auch den Vorteil, dass der G-Buffer und die Screenspace-Lightmap eine geringere Auflösung als der Bildschirm haben können.
Ich hatte einen strengen GLES 2.0-basierten Renderer implementiert (obwohl ein experimenteller) und es gelang mir, den G-Buffer auf eine RGBA-Textur zu reduzieren (ja, ich habe eine texture2D anstelle eines Renderbuffers verwendet). Es enthielt die normale Karte des Bildschirmbereichs + den Tiefenpuffer im Alphakanal (der, soweit ich mich erinnere, mit einem Logarithmus komprimiert wurde).
Die Position Attribute ( so genannte Welt hier) während der Beleuchtung Passes mit der Tatsache berechnet werden, dass in einem perspectivic Vorsprung, .xy durch geteilt wird .z , so dass:
x yfr u s t u m= x yw o r l d/ zw o r l d
Ich habe das xy des Positionsattributs wie folgt approximiert :
x yw o r l d= x yfr u s t u m∗ zw o r l d
Hinweis: Ich musste abhängig von den Einstellungen der Projektionsmatrix weitere Anpassungen vornehmen.
Bemerkenswert ist auch, dass ich die .z- Komponente der normalen Vektoren weglassen konnte, da ich .z aus .xy rekonstruieren konnte, da der normale Vektor normalisiert ist, so dass:
x2+ y2+ z2----------√= 1x2+ y2+ z2= 1z2= 1 - ( x2+ y2)z= 1 - ( x2+ y2)-----------√
Mit dieser Technik konnte ich einen anderen Kanal in meinem RGBA G-Buffer freigeben und damit die spiegelnde Bildschirmkarte (oder, wenn Sie so wollen, den Glanz) speichern.