2013-07-06 11 views
6

Ich lerne OpenGL-Grafiken und komme in den Schatten. Die Tutorials, die ich lese, sagen mir, dass ich meine Normalen und den Lichtvektor in den Kameraraum umwandeln soll. Warum ist das? Warum kannst du nicht einfach die Koordinaten im Modellraum behalten?Warum verwenden Sie Kameraraum statt Modellraum für Normalen?

Eine weitere Frage dazu ist, wie man mit Modelltransformationen umgehen kann. Ich kann keine definitive Antwort finden. Ich habe derzeit diesen Code:

vec3 normCamSpace = normalize(mat3(V) * normal);" 
vec3 dirToLight = (V*vec4(lightPos, 0.0)).xyz;" 
float cosTheta = clamp(dot(normCamSpace, dirToLight),0,1);" 

V ist die Ansicht Matrix oder die Kameramatrix. Ich bin mir nicht sicher, wie das Licht bewegt oder bearbeitet wird, wenn sich das Modell in Position, Rotation und Skalierung ändert.

Antwort

7

Der Hauptgrund ist, dass normalerweise Ihre Lichtpositionen nicht im Modellraum, sondern im Weltall angegeben werden. Damit die Beleuchtung effizient arbeiten kann, müssen alle Berechnungen in einem gemeinsamen Raum stattfinden. In Ihrer üblichen Transformationskette werden die lokalen Koordinaten Modell von der Model-View-Matrix direkt in dem Blick Raum

p_view = MV · p_local 

umgewandelt Da Sie in der Regel nur eine Model-View-Matrix habe es mühsam sein, um diese steap in etwas zu trennen, wie

p_world = M · p_local 
p_view = V · p_world 

Dafür musste MV getrennt werden.

Da die Projektionstransformation traditionell als separater Schritt erfolgt, ist der Betrachtungsraum der natürliche "gemeinsame untere Grund", auf dem die Beleuchtungsberechnung basieren soll. Es beinhaltet lediglich die Transformation der Umwandlung Ihrer Lichtpositionen von der Welt in den Raum, und da die Lichtpositionen nicht sehr komplex sind, geschieht dies auf der CPU und den vortransformierten Lichtpositionen, die als Shader angegeben sind.

Hinweis, dass Sie nichts davon abhält, Beleuchtungsberechnungen im Welt- raum durchzuführen oder den lokalen Raum zu modellieren. Es braucht nur die Lichtpositionen richtig zu transformieren.

+0

In Ordnung, das macht Sinn, obwohl ich diese Ebene der Trennung habe.Ich bin jedoch immer noch unsicher, wie ich die Lichtquelle und die Positionen so verändern soll, dass sie sich für Dinge wie Rotationen und Übersetzungen eignen. – user975989

+0

Der kanonische Weg besteht darin, die Lichtposition so umzuwandeln, wie Sie die Eckpunktposition transformieren. Und im Falle von Spotlights (für die Sie die Spot-Richtung benötigen) transformieren Sie die Spot-Richtung genau so, wie Sie die Normalen transformieren würden. Für jede Transformationsmatrix zwischen Räumen (dies gilt auch für die Transformation von beispielsweise Welt zu Modell lokal) ist die normale Transformation immer die inverse Transponierte der Positionstransformation. – datenwolf

0

Ich lerne OpenGL-Grafiken und komme in den Schatten. Die Tutorials, die ich lese, sagen mir, dass ich meine Normalen und den Lichtvektor in den Kameraraum umwandeln soll. Warum ist das? Warum kannst du nicht einfach die Koordinaten im Modellraum behalten?

Wenn Sie tatsächlich den Shader schreiben, können Sie den gewünschten Koordinatenraum verwenden. IMO, das Licht im Weltall zu berechnen, fühlt sich "natürlicher" an, aber das ist Geschmackssache.

Allerdings gibt es zwei kleine Details:

  1. Sie können nicht „natürlich“ Beleuchtung im Objektraum berechnen, wenn das Objekt ein gehäutet Mesh (Charaktermodell von Knochen animiert) ist. Ein solches Modell wird Welt- oder Sichtfeld benötigen. Wenn Ihr Objekt nur übersetzt und gedreht werden kann (nur affine Transformationen), kann die Beleuchtung im Modell-/Objektraum einfach berechnet werden. Ich denke, einige Game-Engines funktionierten tatsächlich so.
  2. Wenn Sie Kameraraum verwenden, können Sie bei der Berechnung von Glanzlichtern eine Subtraktion löschen. Blinn/phong-Spiegelmodelle benötigen einen Vektor zum (oder von) Auge, um den Spiegelfaktor zu berechnen. Im Kameraraum ist der Vektor von Auge zu Punkt gleich der Punktposition. Dies ist eine sehr kleine Optimierung und es ist wahrscheinlich nicht die Mühe wert.
Verwandte Themen