Wie kann ich eine schnelle Beleuchtung mit mehreren Lichtern implementieren?
Ich möchte den Spieler nicht zurückhalten, er kann eine unbegrenzte Anzahl und möglicherweise überlappende (Punkt-) Lichter in das Level setzen.
Das Problem ist, dass Shader, die dynamische Schleifen enthalten, die zur Berechnung der Beleuchtung erforderlich wären, sehr langsam sind.
Ich hatte die Idee, wenn es zur Kompilierungszeit möglich sein könnte, einen Shader n-mal zu kompilieren, wobei n die Anzahl der Lichter ist. Wenn die Nummer n zur Kompilierungszeit bekannt ist, können die Schleifen automatisch abgewickelt werden. Ist es möglich, n Versionen desselben Shaders mit nur einer unterschiedlichen Anzahl von Lichtern zu generieren?
Zur Laufzeit konnte ich dann entscheiden, welcher Shader für welchen Teil des Levels verwendet werden soll.
Antworten:
Ich glaube, was Sie suchen, heißt Deferred Rendering. Es handelt sich um eine Rendering-Technik, die mit vielen Lichtern sehr gut skaliert werden kann und so gut für die dynamische indirekte Beleuchtung verwendet werden kann. Das bedeutet Tausende von Lichtern auf dem Bildschirm.
Es ist im Grunde eine Technik, bei der Sie zuerst alle Ihre Geometriedaten (Position, Normal, Tiefe) in einen Zwischenpixelpuffer (den sogenannten G-Puffer) rendern. In einem zweiten Durchgang rendern Sie dann eine Lichtform mit ihren Parametern. Der Shader dieses zweiten Durchgangs nimmt die Informationen aus dem G-Puffer, wendet die Lichtberechnung an und mischt sie dann in das endgültige Bild.
Implementierungsdetails finden Sie hier
quelle