GLSL normal mapping (Dot3 bump mapping)

Die TBN Matrix

Ich hoffe die folgende Zusammenfassung ist für die Leute hilfreich, die etwas verwirrt sind, in welche Richtung ein Vektor mit Hilfe der TBN Matrix nun transformiert wird.

Im Netz geistern nämlich unzählige Artikel rum, in denen die TBN Matrix mal in den object space transformiert, mal in den world space und mal in den tangent space.

Die folgenden Punkte nacheinander abgearbeitet, führen zu einem funktionierenden Shader mit schickem normal mapping und sollten die Zusammenhänge verdeutlichen:

1. TBN Matrix für jeden Vertex erstellen. Die TBN Matrix besteht aus drei Vektoren (tangent, binormal, normal). Sie transformiert einen Punkt V vom tangent space in den object space und ist wie folgt aufgebaut:

(Tx, Bx, Nx)
(Ty, By, Ny) * V
(Tz, Bz, Nz)

Von den drei Vektoren tangent, binormal und normal muss aber nur tangent und normal als Attribut an den Shader übergeben werden. Die face normal ist identisch mit der TBN normal und kann daher auch für die TBN Matrix verwendet werden. Die binormal wird per Kreuzprodukt im Shader errechnet.

2. Tangent und face normal können durch Addition mit den tangent und normal Vektoren der benachbarten faces und abschließender Normalisierung „gesmoothed“ werden. Z.B. mit Hilfe von smoothing groups.

3. Tanget und face normal mit der Matrix multiplizieren, die vom object in den world space transformiert (also mit der Matrix, die für die Objektrotation zuständig ist). Das ergibt eine TBN Matrix (bzw dessen tangent und normal), welche einen Punkt V vom tangent space in den world space transformiert.

4. Im Shader wird diese face normal sowie tangent noch mit der NormalMatrix (ähnlich der ModelViewMatrix) multipliziert. Die binormal wird jetzt durch das Kreuzprodukt berechnet. Nun hat man eine TBN Matrix, welche vom tangent space in den camera/eye space transformiert.

5. Die Inverse davon transformiert einen Punkt P vom camera/eye space in den tangent space. Das ist also die entgültige TBN Matrix, die alle für die Lichtberechnung nötigen Vektoren in den tangent space transformiert. Sie entspricht der transponierten TBN Matrix, da deren Basisvektoren orthogonal sind:

(Tx, Ty, Tz)
(Bx, By, Bz) * P
(Nx, Ny, Nz)

Diese Multiplikation mit der inversen TBN Matrix (bzw. der transponierten TBN Matrix) kann man dann im Shader auch so schreiben:

(T dot P)
(B dot P)
(N dot P)

Darum heißt das ganze IMHO auch Dot3 bump mapping. Nachdem alle benötigten Vektoren mit diesen drei dot products in den tangent space transformiert wurden, kann man endlich mit den normals aus der normal map rechnen, welche ja bereits im tangent space liegen und diesen ganzen Zirkus erst nötig gemacht haben.

Happy coding!

Dieser Beitrag wurde unter German, IT abgelegt und mit , , , , , , , , , , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.