2010-08-27 10 views
7

Als ich RedBook gelesen habe 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).OpenGL lights limit

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.

Zum Beispiel haben Sie sehr lange Straße mit 50 Strehlängen, oder Sie können eine Gruppe von 20 Personen alle mit Taschenlampen haben. 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 ist das gemacht, und das Spiel läuft glatt? (Ich lese auch, dass die Aktivierung aller 8 Lichter könnte FPS töten)

Antwort

10

8 Lichter ist die Begrenzung der festen GL-Pipeline, wo Sie jeden von ihnen aktivieren, setzen Sie Modus, Parameter, etc. Jetzt haben Sie Pixel-Shader und Beleuchtung ist innerhalb Shader getan. Dort können Sie eine große Anzahl von dynamische (nicht in Texturen gebacken) 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.

+0

Update: Diese Technik wurde viel diskutiert, hier ist ein Link: http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=267432 – alxx

+0

Schwache Lichter sind keine Shader-Funktion, da die Die Fähigkeit, Lichter zu aktivieren/deaktivieren, könnte außerhalb der festen Pipeline ausgeführt werden, indem ein Lichtmanager entworfen wird, der nur wichtige Lichter ermöglicht. – Luca

+0

Lichtmanager aktiviert/deaktiviert Lichter für die ganze Szene. Pixelshader könnte es pro Pixel tun, sehen Sie den Unterschied? Übrigens, 8 Lichter in der traditionellen Pipeline sind per Vertex, während Shader per Pixel Beleuchtung arbeitet - eine ganz andere Sache. – alxx

4

Einer der Tricks, die in Spielen verwendet wird, ist das Licht mit einer Textur zu simulieren.

In Ihrem Straßenbeleuchtungsbeispiel werden die "beleuchteten" Bereiche tatsächlich ein helleres Texturbild sein. Nur die nächsten Lichter werden Lichtquellen sein, um die richtigen Effekte zu erzielen.

Es gibt ähnliche Ansätze, bei denen halbtransparente Texturen oder Texturen mit einem transparenten Kegel die Szene überlagern, um den gleichen 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 bestimmten Stelle zu berechnen. Also für 8 Lichter rendern Sie die Szene (oder Teile der Szene) bis zu 8 mal vor Rendering tatsächlich die Szene für die Anzeige. Selbst wenn dies auf der GPU statt auf der CPU geschieht, ist es sehr teuer.

5

Beleuchtung ist ein sehr komplexes Thema in der Computergrafik.

Was wirklich wichtig ist, ist natürlich die Objektbeleuchtung, emuliert die reale Weltbeleuchtung oder die Wirkung, die wir anstreben. 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 Lichtpunktabstraktion sind, die es ermöglichen, gerenderte Scheitelpunkte (die für Renderdreiecke verwendet werden) zu "beleuchten" (dh eine Farbe zu geben). ... der Scheitelpunkt wird beleuchtet, erhalten Sie einen Farbbeitrag für jedes Licht.

Wie Sie erwähnt haben, nehmen die Rendering-Prozess mehr Zeit mehr Lichter, die wir aktiviert haben. Um dies zu minimieren, haben Sie verschiedene Möglichkeiten.

  • Light Culling (Ausschließen von Lichtern, deren Beitrag zu wenig ist, um die Farbe zu ändern), und dies wird unter Verwendung von Lichteigenschaften (Abstand, Konus, Dämpfung, Blickwinkel und behindernde Objekte) bestimmt.
  • Statische Beleuchtung, die Texturen verwendet, um Objekte zu beleuchten, die sich niemals bewegen.
  • 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 von Lichtern gefärbt wird, 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 (mithilfe von Shadern oder einer OpenGL-Erweiterung) oder die Pixelfarbe mithilfe von Deferred Lighting 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.