Als ich RedBook gelesen hatte, blieb ich ziemlich verwirrt, dass openGL maximal 8 Lichter in der Szene haben kann (die Anzahl hängt von der Implementierung ab, sollte aber bei 8 liegen).
Aber ich kann mir eine Reihe von Situationen vorstellen, die mehr Licht benötigen würden, also denke ich, dass es im Spielentwickler einen Trick gibt.
Sie haben zum Beispiel eine sehr lange Straße mit 50 Stredlights, oder Sie können einen Trupp von 20 Leuten haben, die alle Taschenlampen benutzen. Wie simulierst du diese Situationen? Es gibt ein Problem, dass Licht nur den Teil des Gitters beleuchtet, nicht den ganzen Kegel zwischen Quelle und Objekt. Wenn wir also keine 100% saubere Luft haben, muss es auch eine Art von Simulation geben. Wie läuft das ab und das Spiel läuft flüssig? (Ich habe auch gelesen, dass die Aktivierung aller 8 Lichter FPS töten könnte)
8 Lichter ist die Begrenzung der festen GL-Pipeline, wo du jeden davon aktivierst, Modus, Parameter usw. einstellst. Jetzt hast du Pixel-Shader und die Beleuchtung wird innerhalb des Shaders gemacht. Dort können Sie viele dynamische (nicht in Texturen eingebrannte) Lichter verwenden. Sie müssen nur alle Parameter dieser Lichter ausreichend (vielleicht in einer Textur) liefern und testen, wie viele Lichter Ihr Shader verarbeiten kann. Außerdem können Sie im Shader zu schwache Lichter (die zu wenig zum Pixelwert beitragen) oder einfach zu weit entfernte entfernen.
Update: komplexer Shader mit Verzweigung kann sogar Lichter erzeugen (denke an lange Straße oder Weihnachtsbaum). Es könnte effizienter sein, als eine große Anzahl von Parametern zu liefern.
Beleuchtung ist ein sehr komplexes Thema in der Computergrafik.
Was wirklich wichtig ist, ist natürlich die Objektbeleuchtung, die die Beleuchtung der realen Welt nachahmt oder den Effekt, auf den wir zielen. Die Beleuchtungsumgebung könnte aus vielen Quellen bestehen, um den tatsächlichen Effekt, den wir erreichen wollen, zu approximieren.
OpenGL-Lichtimplementierung sind dynamische Lichter, die eine Lichtpunktabstraktion sind, die es erlauben, gerenderte Ecken (die für Renderdreiecke verwendet werden) zu "beleuchten" (dh eine Farbe zu geben). ... der Scheitelpunkt leuchtet, erhalten Sie einen Farbbeitrag für jedes Licht.
Wie Sie bereits erwähnt haben, benötigen die Rendering-Prozesse mehr Zeit für mehr Lichter, die wir aktiviert haben. Um dies zu minimieren, haben Sie verschiedene Möglichkeiten.
OpenGL fixed lighting trägt zur Vertexfarbe bei, die mit anderen Eckpunktfarben interpoliert wird, um das Dreieck zu rasterisieren. Wenn die Geometrie aus wenigen Dreiecken besteht, können Sie innerhalb jedes Dreiecks keinen Lichtkegel sehen, da die Farbe des Fragments das Ergebnis der Interpolation von drei Farben (der drei Eckpunkte) ist.
Um eine präzisere Beleuchtung zu erreichen, muss die Software jede Fragment (Pixel) -Farbe (Pixelbeleuchtung) auf die gleiche Weise bestimmen wie ein Scheitelpunkt durch Lichter, aber wie Sie verstehen, könnte es mehr Pixel als Scheitelpunkte geben. Ein Ansatz besteht darin, den Beitrag des Lichts für jedes Pixel der Geometrie während der Rasterungsphase zu berechnen (unter Verwendung von Shadern oder einer OpenGL-Erweiterung) oder die Pixelfarbe durch verzögerte Beleuchtung zu bestimmen.
Verzögerte Beleuchtung verwendet mehrere Texturen (entsprechend dem Ansichtsfenster), um Lichtparameter für jedes angezeigte Pixel zu speichern. Auf diese Weise führen Sie die Lichtberechnung nach der Erzeugung des Bildes durch und bestimmen den Pixellichtbeitrag einmal für jedes Pixel und nicht einmal für jedes Geometriepixel.
Einer der Tricks, die in Spielen verwendet werden, besteht darin, das Licht mit einer Textur zu simulieren.
In Ihrem Straßenbeleuchtungsbeispiel sind die "beleuchteten" Bereiche also tatsächlich ein helleres Texturbild. Nur die nächsten Lichter werden Lichtquellen sein, um die richtigen Effekte zu erhalten.
Es gibt ähnliche Ansätze, bei denen halbtransparente Texturen oder Texturen mit einem transparenten Kegel die Szene überlagern, um denselben Effekt zu erzielen.
Vergessen Sie nicht, dass die Berechnung der Schatten usw. in Echtzeit bedeutet, dass die Szene aus der Sicht des Lichts gerendert werden muss, um die Intensität des Lichts an einer beliebigen Stelle zu berechnen. Bei 8 Lichtern rendern Sie also die Szene (oder Teile der Szene) bis zu 8 mal vor , um die Szene für die Anzeige zu rendern. Selbst wenn dies auf der GPU anstatt auf der CPU gemacht wird, ist es sehr teuer.