TBN Matrix: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (Der Artikel wird nicht seit 4 Jahren offline bearbeitet. Markierung daher entfernt. Warnung in Warnkasten gesteckt.)
K (Sprache verbessert)
Zeile 3: Zeile 3:
 
==Was ist die TBN Matrix==
 
==Was ist die TBN Matrix==
  
Die TBN Matrix ist nach ihren Komponenten benannt, den Vektoren Normal, Bitangent (auch Binormal) und Tangent. Sie ist in der Lage Vektoren aus dem Worldspace in den Texturspace zu transformieren.
+
Die TBN-Matrix ist nach ihren Komponenten benannt, den Vektoren Tangent, Bitangent (auch Binormal) und Normal. Sie ist in der Lage, Vektoren aus dem Worldspace in den Texturspace zu transformieren.
Sie wird für alle Formen des Bumpmapping im Pixelshader benötigt um die Normal- und Höhenmaps vom Texturespace in den Worldspace zu transformieren. In den meisten Fällen tritt sie in normalisierter Form auf und entspricht einer reinen Drehmatrix.
+
Sie wird für alle Formen des Bumpmappings im Pixelshader benötigt um die Normal- und Höhenmaps vom Texturespace in den Worldspace zu transformieren. In den meisten Fällen tritt sie in normalisierter Form auf und entspricht einer reinen Drehmatrix.
  
 
==Wie kann die TBN Matrix berechnet werden==
 
==Wie kann die TBN Matrix berechnet werden==
  
Da die einzigen Erklärungen, die mir bis jetzt bekannt sind auch Englisch sind und dazu mit sehr unverständlichen Formeln gewürzt sind, die auch noch unaussprechliche Zeichen enthalten, versuche ich das ganze mal so zu beschreiben, dass es auch von normalen Programmierern verstanden wird.   
+
Da die einzigen Erklärungen, die mir bis jetzt bekannt sind, auf Englisch und noch dazu mit sehr unverständlichen Formeln gewürzt sind, die auch noch unaussprechliche Zeichen enthalten, versuche ich das Ganze mal so zu beschreiben, dass es auch von normalen Programmierern verstanden wird.   
  
 
[[Bild:triangle_im_texturspace.png]]
 
[[Bild:triangle_im_texturspace.png]]
  
Bekannt sind zum Berechnen der TBN Matrix nur die Textur und Weltkoordinaten des Dreiecks ABC, welches oben abgebildet ist. Die beiden blauen Vektoren, die auf das graue Kreuz gezeichnet sind, spannen zusammen mit der grauen gestrichelten Linie die Textur auf. Der horizontale Vektor repräsentiert zugleich die U Achse der Textur, als auch den Tangentvektor. der vertikale entspricht der V Achse und Bitangent.
+
Bekannt sind zum Berechnen der TBN Matrix nur die Textur- und Weltkoordinaten des Dreiecks ABC, welches oben abgebildet ist. Die beiden blauen Vektoren, die auf das graue Kreuz gezeichnet sind, spannen zusammen mit der grauen gestrichelten Linie die Textur auf. Der horizontale Vektor repräsentiert zugleich die U-Achse der Textur, als auch den Tangentvektor. Der vertikale entspricht der V-Achse und Bitangent.
Im Texturespace sieht es jetzt sehr leicht aus, das Problem ist jedoch, dass wir die TBN Matrix aus der Sicht des Worldspaces beschreiben müssen. Die einzigen Punkte, die wir aus dem Worldspace kennen sind jedoch nur A,B und C.
+
Im Texturespace sieht es jetzt sehr leicht aus, das Problem ist jedoch, dass wir die TBN Matrix aus der Sicht des Worldspaces beschreiben müssen. Die einzigen Punkte, die wir aus dem Worldspace kennen, sind jedoch nur A,B und C.
  
Die Berechnung von Tangent und Bitangent ist fast gleich da nur andere Komponenten eingesetzt werden müssen. Erst einmal nur Tangent:
+
Die Berechnung von Tangent und Bitangent ist fast gleich, da nur andere Komponenten eingesetzt werden müssen. Erst einmal nur Tangent:
  
 
Da unsere Vektoren 5 Komponenten haben: xyzuv, werden einzelne Komponenten durch u oder v markiert. Für die TBN Matrix an sich brauchen nur xyz berechnet zu werden.
 
Da unsere Vektoren 5 Komponenten haben: xyzuv, werden einzelne Komponenten durch u oder v markiert. Für die TBN Matrix an sich brauchen nur xyz berechnet zu werden.
  
Der Tangent entspricht dem Vektor (F-A), Da wir ihn nicht direkt kennen, müssen wir erst (E-A) berechnen. Um den Punkt E zu bekommen muss der Vektor (C-B) so weit verlängert werden, dass er (E-B) ergibt. Um diesen Verlängerungsfaktor zu berechnen nehmen wir die V Komponenten der Texturkoordinaten zu Hilfe:
+
Der Tangent entspricht dem Vektor (F-A), Da wir ihn nicht direkt kennen, müssen wir erst (E-A) berechnen. Um den Punkt E zu bekommen, muss der Vektor (C-B) so weit verlängert werden, dass er (E-B) ergibt. Um diesen Verlängerungsfaktor zu berechnen, nehmen wir die V-Komponenten der Texturkoordinaten zu Hilfe:
  
 
Da Av = Dv ist, muss (D-C)*(Cv-Bv) = (B-C)*(Cv-Av) sein. Das lösen wir nach D auf:
 
Da Av = Dv ist, muss (D-C)*(Cv-Bv) = (B-C)*(Cv-Av) sein. Das lösen wir nach D auf:
Zeile 25: Zeile 25:
 
D = C + (B-C)*((Cv-Av)/(Cv-Bv))
 
D = C + (B-C)*((Cv-Av)/(Cv-Bv))
  
Da der Vektor (D-A) kleiner als 1.0 (im Texturspace!!!) ist, müssen wir ihn noch durch Teilen von (Du-Au) auf die richtige Länge bringen:
+
Da der Vektor (D-A) kleiner als 1.0 (im Texturespace!!!) ist, müssen wir ihn noch durch Teilen von (Du-Au) auf die richtige Länge bringen:
  
 
D = C + (B-C)*((Cv-Av)/(Cv-Bv))
 
D = C + (B-C)*((Cv-Av)/(Cv-Bv))
Zeile 31: Zeile 31:
 
Tangent = (D-A)/(Du-Au)
 
Tangent = (D-A)/(Du-Au)
  
Bitantent lässt sich berechnen, indem B;C, D;E, F;G und u;v getauscht werden:
+
Die Bitangente lässt sich berechnen, indem B;C, D;E, F;G und u;v getauscht werden:
  
 
E = B + (C-B)*((Bu-Au)/(Bu-Cu))
 
E = B + (C-B)*((Bu-Au)/(Bu-Cu))
Zeile 37: Zeile 37:
 
Bitangent = (E-A)/(Ev-Av)   
 
Bitangent = (E-A)/(Ev-Av)   
  
Alternativ lässt sich für normalisierte TBN Matrizen Folgendes schreiben:
+
Alternativ lässt sich für normalisierte TBN-Matrizen Folgendes schreiben:
  
 
Tangent = normalize(C - A + (B-C)*((Cv-Av)/(Cv-Bv)))
 
Tangent = normalize(C - A + (B-C)*((Cv-Av)/(Cv-Bv)))
Zeile 45: Zeile 45:
 
Dabei sollte beachtet werden, dass die Längenberechnung nicht so schnell ist wie die alternative Subtraktion.
 
Dabei sollte beachtet werden, dass die Längenberechnung nicht so schnell ist wie die alternative Subtraktion.
  
Es könnte sein, dass (C-B) parallel zu Tangent oder Bitangent ausgerichtet ist, die Division durch 0 sollte man unbedingt abfangen.
+
Es könnte sein, dass (C-B) parallel zu Tangent oder Bitangent ausgerichtet ist. Die Division durch 0 sollte man unbedingt abfangen.
  
Die am einfachsten zu berechnende Komponente ist der Normalvektor, er ist quasi unabhängig von den Texturkoordinaten. Es gibt zwei Möglichkeiten ihn zu berechnen. Entweder das Kreuzprodukt der Vektoren (C-A)x(B-A) oder das Kreuzprodukt von Tangent x Bitangent.
+
Die am einfachsten zu berechnende Komponente ist der Normalvektor, er ist quasi unabhängig von den Texturkoordinaten. Es gibt zwei Möglichkeiten ihn zu berechnen. Entweder das normalisierte Kreuzprodukt der Vektoren (C-A)x(B-A) oder das Kreuzprodukt von Tangent x Bitangent.
  
 
==Interpolation==
 
==Interpolation==
Zeile 53: Zeile 53:
 
Wie Normalvektoren können auch die TBN Matrizen nur pro Triangle berechnet werden. Um runde Oberflächen zu erhalten, kann es sinnvoll sein, die TBN Matrizen am gemittelten Normalvektor auszurichten. Die die Ausrichtung von Tangent und Bitangent von den Texturkoordinaten abhängt, ist es nicht möglich, sie wie den Normalvektor zu interpolieren.
 
Wie Normalvektoren können auch die TBN Matrizen nur pro Triangle berechnet werden. Um runde Oberflächen zu erhalten, kann es sinnvoll sein, die TBN Matrizen am gemittelten Normalvektor auszurichten. Die die Ausrichtung von Tangent und Bitangent von den Texturkoordinaten abhängt, ist es nicht möglich, sie wie den Normalvektor zu interpolieren.
  
Um die TBN Matrizen zu drehen, sollte die Drehachse mit dem Kreuzprodukt des nicht interpolierten Normalvektors und des interpolierten Normalvektors gebildet werden. Den Winkel kann man über das Skalarprodukt berechnen. Abschließend müssen Tangent und Bitangent nur noch um die Drehachse mit dem errechneten Winkel rotiert werden. Für Solid (nicht oth) gekennzeichnete Flächen kann dieser Schritt komplett entfallen.
+
Um die TBN Matrizen zu drehen, sollte die Drehachse mit dem Kreuzprodukt des nicht interpolierten Normalvektors und des interpolierten Normalvektors gebildet werden. Den Winkel kann man über das Skalarprodukt berechnen. Abschließend müssen Tangent und Bitangent nur noch um die Drehachse mit dem errechneten Winkel rotiert werden. Für Solid (nicht smooth) gekennzeichnete Flächen kann dieser Schritt komplett entfallen.
  
 
==Bitangent/Binormal==
 
==Bitangent/Binormal==
  
 
Es genügt Tangent oder Bitangent im Model zu speichern. Bitangent lässt sich auch nach durchgeführten Transformationen per Kreuzprodukt wiederherstellen. Im Vertexshader sollten zunächst Normal und Tangent mit der Normalmatrix rotiert werden (je 3 Skalarprodukte) und erst dann mit einem Kreuzprodukt ein passender Bitangentvektor berechnet werden. Das Kreuzprodukt sollte sich schneller berechnen lassen als die 3 Skalarprodukte einer Vektor/Matrixmultiplikation. Zusätzlich wird eine Komponente bei den Attributen gespart.
 
Es genügt Tangent oder Bitangent im Model zu speichern. Bitangent lässt sich auch nach durchgeführten Transformationen per Kreuzprodukt wiederherstellen. Im Vertexshader sollten zunächst Normal und Tangent mit der Normalmatrix rotiert werden (je 3 Skalarprodukte) und erst dann mit einem Kreuzprodukt ein passender Bitangentvektor berechnet werden. Das Kreuzprodukt sollte sich schneller berechnen lassen als die 3 Skalarprodukte einer Vektor/Matrixmultiplikation. Zusätzlich wird eine Komponente bei den Attributen gespart.

Version vom 1. Januar 2014, 19:40 Uhr

Warnung.png Der Artikel ist mit Vorsicht zu genießen: Alles noch nicht überprüft.

Was ist die TBN Matrix

Die TBN-Matrix ist nach ihren Komponenten benannt, den Vektoren Tangent, Bitangent (auch Binormal) und Normal. Sie ist in der Lage, Vektoren aus dem Worldspace in den Texturspace zu transformieren. Sie wird für alle Formen des Bumpmappings im Pixelshader benötigt um die Normal- und Höhenmaps vom Texturespace in den Worldspace zu transformieren. In den meisten Fällen tritt sie in normalisierter Form auf und entspricht einer reinen Drehmatrix.

Wie kann die TBN Matrix berechnet werden

Da die einzigen Erklärungen, die mir bis jetzt bekannt sind, auf Englisch und noch dazu mit sehr unverständlichen Formeln gewürzt sind, die auch noch unaussprechliche Zeichen enthalten, versuche ich das Ganze mal so zu beschreiben, dass es auch von normalen Programmierern verstanden wird.

triangle im texturspace.png

Bekannt sind zum Berechnen der TBN Matrix nur die Textur- und Weltkoordinaten des Dreiecks ABC, welches oben abgebildet ist. Die beiden blauen Vektoren, die auf das graue Kreuz gezeichnet sind, spannen zusammen mit der grauen gestrichelten Linie die Textur auf. Der horizontale Vektor repräsentiert zugleich die U-Achse der Textur, als auch den Tangentvektor. Der vertikale entspricht der V-Achse und Bitangent. Im Texturespace sieht es jetzt sehr leicht aus, das Problem ist jedoch, dass wir die TBN Matrix aus der Sicht des Worldspaces beschreiben müssen. Die einzigen Punkte, die wir aus dem Worldspace kennen, sind jedoch nur A,B und C.

Die Berechnung von Tangent und Bitangent ist fast gleich, da nur andere Komponenten eingesetzt werden müssen. Erst einmal nur Tangent:

Da unsere Vektoren 5 Komponenten haben: xyzuv, werden einzelne Komponenten durch u oder v markiert. Für die TBN Matrix an sich brauchen nur xyz berechnet zu werden.

Der Tangent entspricht dem Vektor (F-A), Da wir ihn nicht direkt kennen, müssen wir erst (E-A) berechnen. Um den Punkt E zu bekommen, muss der Vektor (C-B) so weit verlängert werden, dass er (E-B) ergibt. Um diesen Verlängerungsfaktor zu berechnen, nehmen wir die V-Komponenten der Texturkoordinaten zu Hilfe:

Da Av = Dv ist, muss (D-C)*(Cv-Bv) = (B-C)*(Cv-Av) sein. Das lösen wir nach D auf:

D = C + (B-C)*((Cv-Av)/(Cv-Bv))

Da der Vektor (D-A) kleiner als 1.0 (im Texturespace!!!) ist, müssen wir ihn noch durch Teilen von (Du-Au) auf die richtige Länge bringen:

D = C + (B-C)*((Cv-Av)/(Cv-Bv))

Tangent = (D-A)/(Du-Au)

Die Bitangente lässt sich berechnen, indem B;C, D;E, F;G und u;v getauscht werden:

E = B + (C-B)*((Bu-Au)/(Bu-Cu))

Bitangent = (E-A)/(Ev-Av)

Alternativ lässt sich für normalisierte TBN-Matrizen Folgendes schreiben:

Tangent = normalize(C - A + (B-C)*((Cv-Av)/(Cv-Bv)))

Bitangent = normalize(B - A + (C-B)*((Bu-Au)/Bu-Cu)))

Dabei sollte beachtet werden, dass die Längenberechnung nicht so schnell ist wie die alternative Subtraktion.

Es könnte sein, dass (C-B) parallel zu Tangent oder Bitangent ausgerichtet ist. Die Division durch 0 sollte man unbedingt abfangen.

Die am einfachsten zu berechnende Komponente ist der Normalvektor, er ist quasi unabhängig von den Texturkoordinaten. Es gibt zwei Möglichkeiten ihn zu berechnen. Entweder das normalisierte Kreuzprodukt der Vektoren (C-A)x(B-A) oder das Kreuzprodukt von Tangent x Bitangent.

Interpolation

Wie Normalvektoren können auch die TBN Matrizen nur pro Triangle berechnet werden. Um runde Oberflächen zu erhalten, kann es sinnvoll sein, die TBN Matrizen am gemittelten Normalvektor auszurichten. Die die Ausrichtung von Tangent und Bitangent von den Texturkoordinaten abhängt, ist es nicht möglich, sie wie den Normalvektor zu interpolieren.

Um die TBN Matrizen zu drehen, sollte die Drehachse mit dem Kreuzprodukt des nicht interpolierten Normalvektors und des interpolierten Normalvektors gebildet werden. Den Winkel kann man über das Skalarprodukt berechnen. Abschließend müssen Tangent und Bitangent nur noch um die Drehachse mit dem errechneten Winkel rotiert werden. Für Solid (nicht smooth) gekennzeichnete Flächen kann dieser Schritt komplett entfallen.

Bitangent/Binormal

Es genügt Tangent oder Bitangent im Model zu speichern. Bitangent lässt sich auch nach durchgeführten Transformationen per Kreuzprodukt wiederherstellen. Im Vertexshader sollten zunächst Normal und Tangent mit der Normalmatrix rotiert werden (je 3 Skalarprodukte) und erst dann mit einem Kreuzprodukt ein passender Bitangentvektor berechnet werden. Das Kreuzprodukt sollte sich schneller berechnen lassen als die 3 Skalarprodukte einer Vektor/Matrixmultiplikation. Zusätzlich wird eine Komponente bei den Attributen gespart.