Verwendung von Quaternionen für Tangential Space Normal Mapping - Probleme, die ich habe

8

Inspiriert von cryteks Präsentation über die Verwendung von Quaternionen zur Speicherung von Tangentialräumen in Quaternionen für kleinere Scheitelpunkte kam ich zu der logischen Schlussfolgerung, dass man Quaternionen zwischen Scheitelpunkten verwenden und diese zum Rotieren verwenden kann, wenn man Quaternionen zum Speichern von Tangentialraum verwenden kann Normale direkt. Dies würde die Notwendigkeit beseitigen, Ihre Tangentialraumvektoren neu zu orthogonalisieren oder einen von ihnen zu rekonstruieren, und es würde eine pro-Fragment-Matrix-Vektor-Multiplikation ausschneiden, die alles durch eine einzelne Quaternion-Vektor-Multiplikation ersetzen würde.

Ich habe versucht, es in meiner OpenGL-App unter Verwendung meiner selbstgemachten Quaternion-Klasse zu implementieren, und ich habe einige Probleme. Ich weiß, dass meine Quaternion aus einer Matrix konstruiert werden kann, multiplizieren Sie die Quaternion mit einem Vektor, und erhalten Sie das gleiche Ergebnis als Multiplikation der Matrix mit dem Vektor - ich habe es erfolgreich auf der CPU-Seite getan. Aber sobald ich anfange, mit ihnen in GLSL zu arbeiten, neigt alles dazu, drunter und drüber zu gehen.

Es ist sehr interessant zu bemerken, dass ich tatsächlich das Muster der normalen Karte erkennen kann, also denke ich, dass ich auf dem richtigen Weg bin. Leider scheint es, dass meine Farben drunter und drüber gehen.

Dies ist die Quaternion-Mathematik, die ich in glsl verwende:

%Vor%

So wird es vom Vertex-Shader übergeben:

%Vor%

Dabei ist quatView eine Quaternion aus der View-Matrix. Dies könnte mein Problem sein, da der Code, der diese Quaternion generiert, davon ausgeht, dass die Matrix orthogonal ist.

Schließlich berechnen wir die bumped-Normale im Fragment-Shader:

%Vor%

So berechne ich eine Quaternion aus 3 vec3's (Wie bekomme ich die Quaternion von den tbn-Vektoren):

%Vor%

Und hier ist, wie ich die Quaternion von einem Mat4 (wie bekomme ich das quatView von der Ansicht matix) zu kalkulieren:

%Vor%

Mir ist bewusst, dass beide nicht mit orthogonalen Matrizen arbeiten.

Allerdings werden nur x und y der Normalen im normalen Puffer gespeichert, ich rekonstruiere z im Lichtpassfragment-Shader mit dem Quadrattrick. Da diese Normalen im Betrachtungsraum sein sollen, ist die z-Komponente immer positiv.

Leider sind meine Ergebnisse falsch und ich weiß nicht, wo ich suchen soll. Ich kann das Muster der normalen Karte erkennen, also muss etwas stimmen.

Wenn jemand mich wissen lassen würde, wo mein Problem sein könnte, oder wenn er Erfahrung damit hat, wird jeder Rat sehr geschätzt.

    
Haydn V. Harach 26.03.2014, 22:35
quelle

1 Antwort

1

Funktioniert Ihr Code gut, wenn Sie die quotenionale Quintetion nur im Vertex-Shader verwenden (indem Sie die Licht- und Kameravektoren in den tangentialen Raum transformieren)? Wenn es nur bricht, wenn du versuchst, die Normale im Pixelshader zu rotieren, dann ist dein Problem die Quaternioninterpolation (wenn nicht, dann habe ich nur 20 Minuten verschwendet).

Problem

Quaternionen stehen nicht in 1: 1-Beziehung zu den orthonormalen Matrizen ausgewählter Händigkeit (ich gehe davon aus, dass Ihre Händigkeit in Ordnung ist, aber Sie sollten das überprüfen). Wenn Sie jede der Quaternion-Komponenten mit -1 multiplizieren, erhalten Sie die gleiche Transformation.

Nun erzeugt Ihr fromMat3 immer eine Quaternion mit positiver W -Komponente. Stellen Sie sich vor, wie die Interpolation entlang einer Kante zwischen (0.99,0,0,0.1) und (-0.99,0,0,0.1) verläuft. Die X -Komponente wird den gesamten Weg durch ihre Achse durchlaufen, was für Sie alle möglichen Schattenprobleme verursacht.

Lösung

Sie müssen sicherstellen, dass irgendeine Quaternioninterpolation (QI) zwischen Quaternionen stattfindet, die zur selben Hemisphäre gehören, d. h. dot(q1,q2) > 0 . Es ist leicht zu sehen, wie diese Überprüfung für die Beispiel-Quaternionen, die ich erwähnt habe, fehlschlägt und wie es funktioniert, wenn du die zweite Quaternion mit -1 multiplizierst.

Der knifflige Teil ist, dass das Korrigieren von QI-Korrektheit das Teilen von Kanten und das Hinzufügen neuer Scheitelpunkte erfordert, so dass es am besten auf der Exporteurseite und nicht während des Ladens des Modells gemacht wird. Werfen Sie einen Blick auf den KRI-Mesh-Export-Code für die Referenz .

Fazit

Ich empfehle Ihnen nicht, aus praktischen Gründen dorthin zu gehen, es sei denn, Sie sind sehr hartnäckig. Stattdessen können Sie einfach Quaternionen im Vertex-Shader verwenden. Wenn Sie jemals eine Hand von GPU Pro 3 Buch bekommen, finden Sie meinen Artikel über Quaternions dort , das genau das gleiche Problem (und die Lösung) im Detail erklärt.

    
kvark 05.08.2014 19:56
quelle

Tags und Links