Soll ich eine Weltmatrix verwenden?


8

Bildreferenz für die Frage:

Objektraum gegen Weltraum

(Bild aus dem CG-Tutorial )

Die D3D9 API hat uns gewöhnungs Welt Matrizen .

Wenn Sie jedoch Weltmatrizen verwenden, müssen Sie eine zusätzliche Matrix im Shader multiplizieren (was für viele Scheitelpunkte gleich ist).

Daher die OpenGL-Konvention, die Modellierungs- und Anzeigematrizen in einer Matrix zu verketten (GL_MODELVIEWMATRIX = View * World).

Was ist besser und warum?

Antworten:


7

Nein. Zu keinem Zeitpunkt sollten Sie jemals eine explizite Weltmatrix in Ihrem Shader haben.

Eine ausführliche Erklärung dafür, warum , finden Sie hier , aber die Kurzversion ist wirklich sehr einfach: Sie brauchen sie nie und sie kann Ihre Gleitkommapräzision beeinträchtigen.

Wenn Ihr Weltraum zu groß ist, kann eine Kamera, die weit vom Ursprung entfernt ist, Probleme mit der Gleitkommapräzision verursachen.

Der gesamte Weltraum ist nichts anderes als ein Vermittler zwischen Modellraum und Kameraraum. Hier können Sie die Kamera und alle anderen Objekte im selben Raum ausdrücken. Sie verwenden es jedoch nur, um eine Matrix von Welt zu Kamera zu generieren, die Sie dann auf alle Matrizen von Modell zu Welt anwenden, um Matrizen von Modell zu Kamera zu erstellen.

Sie können Präzisionsprobleme in C ++ lösen, indem Sie für Matrixberechnungen Doubles anstelle von Floats verwenden. Sie können diese wieder in Floats konvertieren, bevor Sie sie in den Shader hochladen.

Warum sollten Sie jemals eine explizite Weltraum-Transformation in Ihrem Shader benötigen ? In Ihrem Quellcode ja. Aber in deinem Shader? Was würden Sie damit machen, was Sie mit dem Kameraraum nicht machen können?

Die Beleuchtung kann im Kameraraum genauso einfach erfolgen wie im Weltraum. Alles, was Sie tun müssen, ist, Ihre Lichtpositionen / -richtungen in Kameraraum umzuwandeln. Immerhin hat der Kameraraum den gleichen Maßstab wie der Weltraum. Sie führen diese Transformation einmal pro Bild und Licht durch. selbst für die CPU kaum eine Leistungsbelastung.

Es macht also absolut keinen Sinn, Ihre Shader jemals einer expliziten Weltraumtransformation auszusetzen . Es ist nur ein Zwischenschritt, den Sie in Ihre Matrizen falten.


1

Sie würden die zusätzliche Matrix in Ihrem Shader nicht multiplizieren. Der Trick besteht darin, dass Sie Ihre Matrixmultiplikation einmal pro Frame auf der CPU durchführen und dann das Endergebnis in Ihren Vertex-Shader hochladen. Das gibt Ihnen eine Position durch Matrixmultiplikation pro Scheitelpunkt, unabhängig davon, ob Sie Welt und Ansicht getrennt oder verkettet haben.


0

In vielen Fällen möchten Sie die Weltposition ohnehin für andere Zwecke im Vertex-Shader haben. Beispielsweise müssen Sie den Ansichtsvektor berechnen, um ihn in den Pixel-Shader zu übertragen und die Spiegelung auszuwerten.

Die Local-to-World-Matrix wird auch benötigt, um Tangentenvektoren und Normalvektoren [1] für die Schattierung in den Weltraum umzuwandeln, vorausgesetzt, Sie schattieren im Weltraum (möglicherweise im Tangentenraum, in diesem Fall benötigen Sie dies) ein anderer Satz von Matrizen).

IMO ist es also sinnvoll, zwei Matrizen zu haben: Local-to-World und World-to-Clip. Letzteres ist das Produkt der Ansichtsmatrix und der Projektionsmatrix. Übergeben Sie beide an den Vertex-Shader und führen Sie die Multiplikationen wie folgt aus:

posWorld = mul(posLocal, matLocalToWorld)
posClip = mul(posWorld, matWorldToClip)

[1] (Solange Sie keine ungleichmäßige Skalierung haben. In diesem Fall müssen Normalen durch die inverse Transponierung der Matrix von lokal zu Welt transformiert werden.)



@NicolBolas: Guter Punkt; Es gibt Präzisionsprobleme mit der Schattierung im Weltraum. Das bedeutet nicht, dass Sie Kameraraum verwenden müssen. Bei meiner Arbeit verwenden wir tatsächlich einen "kamerazentrierten Weltraum" - Achsen, die auf die Welt ausgerichtet sind und ihren Ursprung in der Kamera haben. Weltausgerichtete Achsen erleichtern das Anwenden von Cubemaps, die im Weltraum gespeichert sind.
Nathan Reed
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.