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.
Update: Diese Technik wurde viel diskutiert, hier ist ein Link: http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=267432 – alxx
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
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