Frage

Also habe ich bekommen, um die Grundbeleuchtung in meinem OpenGL-learning-Suche.

Stellen Sie sich diese einfachsten Beleuchtung Modell.Jeder vertex hat eine position, die Farbe und normal.Der shader wird die ModelViewProjection matrix (MVP), Modelview-matrix(MV) und der Normalen matrix (N), die berechnet, wie (MV-1)T, sowie LightColor und LightDirection als Uniformen.Der vertex-shader führt die Berechnung der Beleuchtung - der fragment-shader nur Ausgänge mit den interpolierten Farben.

Nun, in jedem tutorial zu diesem Thema, die ich über gekommen sind, sehe ich zwei Dinge, die puzzle-ich.Erste, die LightDirection wird bereits davon ausgegangen, dass in eye-Koordinaten.Zweite, die Ausgabe Farbe ist berechnet als

max(0, dot(LightDirection, N * normal))*LightColor*Color;

Ich würde erwarten, dass die LightDirection sollte invertiert werden erste, das ist die richtige Formel, würde ich denken, ist

max(0, dot(-LightDirection, N * normal))*LightColor*Color;

Es scheint, dass es ist davon auszugehen, dass die LightDirection tatsächlich ist das Gegenteil der Vektor der tatsächlichen Lampe.

Q1:Ist dies eine Art etablierte Konvention, dass die LightDirection in diesem Modell wird davon ausgegangen, dass der Vektor auf der unendlich weit Lichtquelle, sondern als den Vektor, der die Richtung von Licht oder ist dies nicht die Hauptsache, und es ist einfach so passiert, dass in den tutorials die ich stieß, war es so ausgegangen?

Q2:Wenn LightDirection ist in Welt-Koordinaten, anstatt in die Augen-Koordinaten, sollte es transformiert werden, die mit der normalen matrix oder die modelview-matrix auf die eye-Koordinaten?

Vielen Dank für die Klarstellung, diese Dinge!

War es hilfreich?

Lösung

Q1: Ist diese Art von festgelegter Konvent Tutorials, auf die ich gestoßen bin, wurde so angenommen?

In der festen Funktion OpenGL bei der Lieferung der Position des Lichts ermittelte der 4. Parameter, wenn das Licht richtungsweise oder Position war. Bei Richtungslicht lieferte der Vektor auf die (unendlich weit entfernte) Lichtquelle.

Im Falle einer Positionslichtquelle wird die Lichtdirektion pro Scheitelpunkt als berechnet LightDirection = LightPosition - VertexPosition -- Der Einfachheit halber Diese Berechnung erfolgt in Augenkoordinaten.

F2: Wenn sich eine Lichtdirektion eher in Weltkoordinaten als in Augenkoordinaten befindet, sollte sie mit der normalen Matrix oder der ModelView -Matrix zu Augenkoordinaten transformiert werden?

In fester Funktion OpenGL die leichte Position durch geliefert durch glLighti wurde durch die aktuelle Modellview -Matrix des Anrufzeits transformiert. Wenn das Licht in Position war, wurde es durch die übliche ModelView -Matrix transformiert. Bei einem Richtlicht wurde die normale Matrix verwendet.

Andere Tipps

Ist dies eine Art etablierte Konvention, dass die LightDirection in diesem Modell wird davon ausgegangen, dass der Vektor auf der unendlich weit Lichtquelle, sondern als den Vektor, der die Richtung von Licht oder ist dies nicht die Hauptsache, und es ist einfach so passiert, dass in den tutorials die ich stieß, war es so ausgegangen?

Weder noch.Es gibt einfach mehrere Arten von Lichtern.

Gerichteten Licht stellt eine Lichtquelle, die aus der Perspektive der Szene, ist unendlich weit entfernt.Es wird dargestellt durch Vektor-Richtung.

Eine positions-Licht stellt eine Licht Quelle, die hat eine position im Raum die Szene.Es wird dargestellt durch Vektor-position.

Es ist bis zu Ihrer shaders Beleuchtung Modell, um welches es nutzt.In der Tat, Sie könnte haben ein gerichtetes Licht und mehrere Punkt-Lichter, alle auf den selben Modell.Es ist bis zu Ihnen.

Die tutorials, die Sie sah einfach verwendet, gerichtetes Licht.Obwohl Sie wahrscheinlich sollte zumindest erwähnt werden, die gerichtetes Licht, Näherung.

Wenn LightDirection ist in Welt-Koordinaten, anstatt in die Augen-Koordinaten, sollte es transformiert werden, die mit der normalen matrix oder die modelview-matrix auf die eye-Koordinaten?

Weder noch.Wenn das Licht seine Richtung in Welt-Koordinaten, dann brauchen Sie, um die normale in Welt-Koordinaten als gut.Es ist egal, welchen Raum Sie beleuchten in (obwohl tut es in der clip-space oder andere non-linear post-projektive Räume ist ziemlich schwer);was zählt, ist, dass alles ist in die gleichen Raum.

Die Standard-OpenGL-modelview-matrix tut, was es sagt:es geht aus dem Modellbereich zu Ansicht Raum (Sichtraum.Es geht durch Raum der Welt, aber es ist noch nicht vorbei.Und die Standard-OpenGL-normalen matrix ist gerade die inverse-transponieren der modelview-matrix.Also weder von Ihnen bekommen Sie zu Welt Platz.

Im Allgemeinen sollten Sie nicht tun, Beleuchtung (oder irgendetwas anderes auf der GPU) im Raum der Welt, die aus Gründen am besten an anderer Stelle erklärt.In Auftrag zu machen die Beleuchtung im Raum der Welt, die Sie benötigen, um Matrizen zu verwandeln, Welt-Raum.Mein Vorschlag wäre, es richtig zu machen:legen Sie die Richtung von Licht im Auge Raum und lassen Raum der Welt zu CPU-code.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top