Ich beginne mit GLSL und habe eine einfache verzögerte Schattierung implementiert, die G-Puffer mit Positionen, Normalen und Albedo ausgibt.
Ich habe auch einen einfachen Punktlicht-Shader geschrieben.
Jetzt zeichne ich eine Kugel für das Punktlicht und die Ausgabe geht in einen Beleuchtungspuffer.
Das Problem ist, wie kombiniere ich die Ergebnisse des Beleuchtungspuffers beim Zeichnen mehrerer Lichter?
Wenn ich beispielsweise das zweite Licht mit dem Punktlicht-Shader zum Lichtpuffer zeichne, wie füge ich dem zweiten Licht im Lichtpuffer das erste Licht hinzu? Ich meine, Sie können nicht aus demselben Ausgabepuffer lesen und in diesen schreiben?
opengl
shaders
glsl
deferred-rendering
JBeurer
quelle
quelle
Für meinen verzögerten Renderer aggregiere ich alle Lichter unter Verwendung der Informationen aus dem g-Puffer zu einem Lichtrenderziel und probiere dann das Renderziel auf Lichtintensität aus, während ich mein endgültiges Backbuffer-Bild erstelle.
Im Grunde genommen führe ich meine gesamte Spielgeometrie durch meinen Geometriepass, um die G-Puffer zu erstellen. Von dort füttere ich meinen Light Pass Shader mit den G-Puffern. Jedes Licht wird mit einem Vollbild-Quad durch den Pass geführt. Auf diese Weise kann mein Pixel-Shader die Lichtintensität für alle sichtbaren Oberflächen aus dem G-Puffer berechnen und sie dann zum Lichtrenderziel hinzufügen. Sie fügen einfach die Lichtintensität für jedes Licht zum Lichtpuffer hinzu, stellen jedoch sicher, dass Sie die Intensität von 0 auf 1 klemmen.
Alles, was Sie tun müssen, um verschiedene Arten von Lichtern (Punkt, Scheinwerfer, Parallel) zu handhaben, ist, den Lichtdurchgang robuster zu machen, indem Sie möglicherweise einen konstanten Puffer verwenden, um festzulegen, welche Beleuchtungsverfahren ausgeführt werden sollen.
quelle
Es gibt wahrscheinlich eine bessere Antwort als diese, aber ich weiß, wenn Sie in Ihrem Shader den Code wiederholen, der für ein zweites Licht erforderlich ist, können Sie zwei Lichter auf einem einzelnen Objekt anstatt auf einem verarbeiten. Es erfordert viel Code für das zweite Licht und die Nähte sind etwas überflüssig, aber ich weiß, dass es funktioniert. Ich glaube jedoch, dass es eine elegantere Lösung geben könnte, wie jemand hoffentlich für Sie hervorheben wird.
quelle