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

Aktuelle Zeit: So Jul 27, 2025 11:15

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Mär 21, 2005 19:09 
Offline
DGL Member

Registriert: Mi Aug 28, 2002 17:03
Beiträge: 37
Wohnort: ABG
Hi!
Ich möchte die Vertexnormale vertex.nomal mit der aktuellen Modelview-Matrix state.matrix.modelview multiplizieren.

Wie geht das?

In dem VertexProgram-Tutorial von delphigl.com gibt es z. B. soetwas hier:
Code:
  1. DP4 temp.x, ModelViewProj[0], vertex.position;
  2. DP4 temp.y, ModelViewProj[1], vertex.position;
  3. DP4 temp.z, ModelViewProj[2], vertex.position;
  4. DP4 temp.w, ModelViewProj[3], vertex.position;


Ich bezweifle jedoch, das hier ModelViewProj mit dem vertex.position vektor multipliziert wird, sondern irgendwas anderes (halt jeder Zeilenvektor der Matrix mit dem vertex.position Vektor das Punktprodukt errechnen)

Wo wir gerade dabei sind, wie könnte ich den resultierenden Vektor normalisieren? Normalerweise müsste ich ja alle Komponenten des Vektors durch seine Länge teilen. Jedoch habe ich aus dem befehlssatz kein DIV und keine Funktion für die Länge gefunden.

mfg olli

_________________
Programmieren beginnt im Kopf und endet im Compiler


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 21, 2005 19:15 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Bei dem Vektor braucht man nur die obere 3x3 Matrix.

Code:
  1. DP3 temp.x, state.matrix.modelview.row[0], vertex.normal;
  2. DP3 temp.y, state.matrix.modelview.row[1], vertex.normal;
  3. DP3 temp.z, state.matrix.modelview.row[2], vertex.normal;


Man kann nur Kehrwert bzw. den Kehrwert der Wurzel bilden. So normalisier man z.B. den Vektor v. DIV gibt es ab PS3.0. Da muß man dann OPTION NV_fragment_program2; verwenden, aber das geht nur auf der gf6. Mit den erweiterten Optionen gibt es außerdem auch direkt einen Befehl zum Normalisieren, aber es nützt ja nichts wenn es nicht überall läuft.

Code:
  1. DP3 v.w,v,v;
  2. RSQ v.w,v.w,
  3. MUL v.xyz,v,v.w;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 22, 2005 13:00 
Offline
DGL Member

Registriert: Mi Aug 28, 2002 17:03
Beiträge: 37
Wohnort: ABG
Hi!
Ich danke dir!

Ich verstehe jedoch noch nicht, warum das mit dem Punktprodukt geht.
Also normalerweise wird ja ein Vektor v mit einer Matrix m so multipliziert:

Code:
  1. neu.x = m.row[0].x*v.x + m.row[1].x*v.y + m.row[2].x*v.z + m.row[3].x*v.w
  2. neu.y = m.row[0].y*v.x + m.row[1].y*v.y + m.row[2].y*v.z + m.row[3].y*v.w
  3. neu.z = m.row[0].z*v.x + m.row[1].z*v.y + m.row[2].z*v.z + m.row[3].z*v.w
  4. neu.w = m.row[0].w*v.x + m.row[1].w*v.y + m.row[2].w*v.z + m.row[3].w*v.w


Und jetzt mal dein Code(ich habe mal DP4 genommen für w komponente):
Code:
  1. DP4 neu.x, m.row[0], v;
  2. DP4 neu.y, m.row[1], v;
  3. DP4 neu.z, m.row[2], v;
  4. DP4 neu.w, m.row[3], v;


Die erste Zeile macht ja praktisch das hier:
Code:
  1. neu.x = m.row[0].x*v.x + m.row[0].y*v.y + m.row[0].z*v.z + m.row[0].w*v.w


Es bildet also das Punktprodukt von Vektor v zum ZEILEN-Vektor der Matrix m.
Aber die normale Berechnung sieht ja vor, das Punktprodukt von Vektor v und SPALTEN-Vektor der Matrix m.

mfg olli

_________________
Programmieren beginnt im Kopf und endet im Compiler


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 25, 2005 22:31 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Ne das stimmt schon so. Man berechnet jeweils das Skalarprodukt einer Zeile von der Matrix mit dem Vektor. Wenn man die Spalten nimmt, kann man dadurch die Transformation wieder rückgängig machen, falls die Matrix orthonormal ist. Bei glsl muß man aufpassen, weil es da beide Varianten Matrix * Vector und Vector * Matrix gibt.
Zu Matrizen gibt es auch ein Tutorial:
http://www.delphigl.com/script/do_show. ... 1&action=2
Unter OpenGL wird die Matrix, im Gegensatz zur D3D, spaltenweise gespeichert:
Code:
  1. 0 4 8  12
  2. 1 5 9  13
  3. 2 6 10 14
  4. 3 7 11 15

Vielleicht meinst du das.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 26, 2005 18:33 
Offline
DGL Member

Registriert: Mi Aug 28, 2002 17:03
Beiträge: 37
Wohnort: ABG
Hi!
Ahh der Hinweis hat mir gefehlt, das in OpenGL die Spaltenvektoren mit den Zeilenvektoren vertauscht sind. Vielen Dank!
mfg olli

_________________
Programmieren beginnt im Kopf und endet im Compiler


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.013s | 16 Queries | GZIP : On ]