Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 19, 2025 22:47

Foren-Übersicht » Programmierung » Shader
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Frage zu gl_NormalMatrix
BeitragVerfasst: So Feb 18, 2007 10:13 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Hiho,

ich befasse mich gerade etwas ausführlicher mit der Shadertheorie, daher hier mal wieder ne Frage^^

Laut Spec ist "uniform mat3 gl_NormalMatrix" die transponierte der auf 3x3 gekürzten ModelView-Matrix.

inverse der ModelView ist soweit klar: damit kann ich einen Vektor aus dem globalen KS in das lokale(also in den "Model-Space") transformieren, um also z.B. den globalen Lichtrichtungsvektor in das lokale System des Normalenvektors zu bekommen.

Aber warum zum Teufel ist die transponiert ?????

edit: bitte verschieben Gemacht (N.M.)
warum postest der das im allgemeinen, ich war doch grade noch im Shader-Board oO

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Frage zu gl_NormalMatrix
BeitragVerfasst: So Feb 18, 2007 10:51 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
Pellaeon hat geschrieben:
inverse der ModelView ist soweit klar: damit kann ich einen Vektor aus dem globalen KS in das lokale(also in den "Model-Space") transformieren, um also z.B. den globalen Lichtrichtungsvektor in das lokale System des Normalenvektors zu bekommen.

Aber warum zum Teufel ist die transponiert ?????

Also einige Matrizen lassen sich allein durch Transposition invertieren. Dazu gehören alle Matrizen, deren Spalten als Vektoren jeweils alle Länge 1 haben und senkrecht aufeinander stehen. Die kann man auch anders beschreiben: Das sind alle echten Rotationsmatrizen und alle unechten Rotationsmatrizen (sind die Rotationen und gleichzeitug auch noch über eine Achse spiegeln). Das sind dann aber auch alle.
Jedenfalls, wenn du zum erzeugen deiner Modelview Matrix nur glTranslate, glRotate, glLoadIdentity ( sowie glScale, dann aber nur mit Parametern entweder 1 oder -1 -> unechte Rotation. Andere Skalierungen machen das kaputt!) verwendet hast, dann ist die inverse Rotations der Modelview tatsächlich durch das transponieren der linken oberen 3x3 Matrix zu bekommen. (Beweisen kann man das am besten dadurch, daß Rotationsmatrizen das Skalarprodukt erhalten und rechnet das dann einfach aus.) Insofern ist die Aussage mit inversen und transponierten schon richtig, nur nicht ganz global - besser kann ichs aber nicht klären. Jedenfalls kann man leicht verhindern, daß die inverse schon durch transponieren zu haben ist, z.B. durch Einsatz eines glScale(2,1,1) oder glScale(0,0,0), womit klar ist, daß man prinzipiell die Modelview Matrix nicht verlässlich invertieren können muss.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 18, 2007 11:42 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
achso ok, also in der Spec steht das folgender Maßen:

Zitat:
transpose of the inverse of the upper leftmost 3x3 of gl_ModelViewMatrix


Das hab ich so aufgefasst das halt erst invertiert wird und dann transponiert.
Dann wärs ja doppelt gemoppelt?
Meh steht in der Spec dazu leider irgendwie nicht drinne.
Weil dann würde es ja ja bedeuten, dass die NormalMatrix doch vom lokalen zum globalen transformiert und nicht umgekehrt.

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 18, 2007 11:58 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
In diesem pdf von NVidia ist das genauer erklärt (ab Seite 12). Da sind auch Zeichnungen dabei:
http://developer.nvidia.com/object/math ... hting.html


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 18, 2007 12:50 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
oha danke für den Link!

aber irgendwie kann ich da ein paar Sachen nicht ganz nachvollziehen.
Da steht

n_e = M^(-T) * n_0.

Warum wird das ^(-T)?

Ich kenn das anders:
Man nimmt die ModelView-Matrix und muss die Verschiebung raushauen, damit man sie auf Vektoren anwenden kann.
Verschiebung ist in der 4. Spalte, also einfach aus der 4x4 ne 3x3 machen und jeweils 4. Zeile und Spalte weglassen.

Und die resultierende 3x3-Matrix ist jetzt dazu da, von dem lokalen ins globale KS umzurechnen.
Warum tun die da so umständliche erst inverse machen und dann transponieren?

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 18, 2007 12:55 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
ahh ok jetzt hab ich's, wegen der Skalierung, die sollte man beachten^^

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 15 Queries | GZIP : On ]