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

Aktuelle Zeit: Sa Jul 19, 2025 16:21

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Normalen in Viewspace transformieren
BeitragVerfasst: So Jun 21, 2009 11:24 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
Hi, ich habe ein Problem meine Normal in den Viewspace zu tranformieren. Man agt ja, das die Transformation mit der transponierten der inversen ModelView-Matrix erreicht wird und, das diese Matrix durch die gl_NormalMatrix repräsentiert wird in glsl. Mein Problem ist jetzt, dass ich die ModelViewMatrix von Hand setze, da ich meine Camera berechnungen alle losgelöst von den Typischen gl-transformationen mache. Mein Programm spuckt mir jetzt aber ganz merkwürdige Normalen rauß. Um genau zu sein scheint es so, als wenn sich ie Normalen "gegen den Objectspace drehen". Ich habe nicht den hauch einer Ahnung, was ich falsch mache. Ich habe mal eine Anwendung dzugepackt, damit ihr euch das selbst anschauen könnt. Im Shader passiert übrigens nichts großartiges:

vertex shader
Code:
  1.  
  2.   varying vec3 normal;
  3.  
  4.   void main(void)
  5.   {
  6.     normal          = normalize(gl_NormalMatrix * gl_Normal);
  7.     gl_Position     = gl_ModelViewProjectionMatrix * gl_Vertex;
  8.   }
  9.  


fragment shader
Code:
  1.  
  2.   varying vec3 normal;
  3.  
  4.   void main(void)
  5.   {
  6.     gl_FragColor          = vec4(vec3(normal.xyz)*0.5+0.5,1.0);
  7.   }
  8.  


Dateianhänge:
Dateikommentar: NormalProblem
NormalProblem.rar [249.28 KiB]
366-mal heruntergeladen

_________________
Klar Soweit?
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 21, 2009 11:49 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Mein Problem ist jetzt, dass ich die ModelViewMatrix von Hand setze, da ich meine Camera berechnungen alle losgelöst von den Typischen gl-transformationen mache.

Das ist kein Problem.

Zitat:
Hi, ich habe ein Problem meine Normal in den Viewspace zu tranformieren.

Ich vermute mal du willst gar nicht in den Viewspace transformieren, sondern in den Worldspace, oder? Die Normalen sollen also unabhängig von der Kameraposition sein, d.h. wenn du dich um das Objekt bewegst soll sich in deinem Beispiel die Farbe der Normale nicht ändern.
In dem Fall wäre dein Problem, dass die ModelViewMatrix eben die ModelViewMatrix ist und nicht nur die ModelMatrix.

(ich habe mir dein Programm nicht angeguckt)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 21, 2009 12:27 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
deine Vermutung war leider nicht richtig. Ich möchte, dass die Normalen immer auf den Betrachter ausgerichtet erscheinen, nicht dass sie die Richtung im Raum repräsentieren. So wie es auf vielen Seiten im Netz beschrieben wird einfach normalize(gl_NormalMatrix* glNormal) zu rechnen scheint nicht zu klappen.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 21, 2009 12:42 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
hm, bei mir funktioniert das so.
Sind den die Normalen richtig? Sind die Normalen vielleicht einfach nur falsch rum? Also mal
Code:
  1. normalize(gl_NormalMatrix * (-gl_Normal));

versucht?

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 21, 2009 13:08 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
Das hab ich auch schon probiert. Die Lösung ist es leider nicht. Mir ist aufgefallen, das wenn ich frontal auf das gebilde schaue, ohne, dass ich die Camera drehe, dann sind die normalen in Ordnung. Betrachte ich etwas aus einem anderen Winkel, scheint es so, als wenn die Normalen entgegen meiner Rotation um das Model wandern. Es ist etwas schwer zu erklären. Hast du dir das Programm einmal angesehen, das ich mit angehängt habe?

In dem Programm hat man nen Mouselook und steuert mit w a s d und shift/strg sind für hoch/runter entlang der Worldspace-Y-achse. Oder meintest du, dass das Programm bei dir funktioniert. Wenn das der Fall ist, dann hätte ich gerne einmal einen screenshot davon, denn dann müsste ja irgendwas mit meine Rechner nicht stimmen, aber ich gehe eher von meiner mathematischen Inkompetenz aus.

Edit: Ich habe einen kleinen verdacht! Und zwar ist die gl_NormalMatrix eine 3x3Matrix, meine ModelViewMatrix ist allerdings eine 4x4Matrix. Alles halb so wild, aaaaaber in der letzten Zeile der ModelViewMatrix tauchen bei mir punktprodukte auf, wenn ich also jetzt das inverse daraus entwickle und dann transponiere, habe ich automatisch auch werte in der 4.spalte stehen, diese werden aber von er NormalMatrix verworfen, weil sie ja nur 3x3 ist und keine 4.Spalte besitzt. Kommt das in etwa hin, oder ist das blödsinn?

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 21, 2009 14:31 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Edit: Ich habe einen kleinen verdacht! Und zwar ist die gl_NormalMatrix eine 3x3Matrix, meine ModelViewMatrix ist allerdings eine 4x4Matrix. Alles halb so wild, aaaaaber in der letzten Zeile der ModelViewMatrix tauchen bei mir punktprodukte auf, wenn ich also jetzt das inverse daraus entwickle und dann transponiere, habe ich automatisch auch werte in der 4.spalte stehen, diese werden aber von er NormalMatrix verworfen, weil sie ja nur 3x3 ist und keine 4.Spalte besitzt. Kommt das in etwa hin, oder ist das blödsinn?

Die NormalMatrix ist 3x3, weil sie keine Translation beinhaltet. Von daher ist das ok. Probleme gibt es nur wenn du eine Projektion in deine ModelViewMatrix einbaust. Projektion kommt in die Projection-Matrix.

Zitat:
Hast du dir das Programm einmal angesehen, das ich mit angehängt habe?

Nein, habe weder Delphi noch Windows ;) Kannst ja mal nen paar Screenshots machen :)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 21, 2009 15:48 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
So hier mal 3 Screenshots. Auf dem ersten ist der Effekt mit normal = normalize(gl_Normal); aufgenommen. So wie diese Farben zu sehen sind, soll es immer aussehen und zwar von egal wo betrachtet. Das zweite und dritte Bild zeigen, wie sich die Normalen aber tatsächlich verhalten.

meine modelviewmatrix erstelle ich übrigens aus der Orientierung der Camera, im etwa so:
Code:
  1.  
  2.   tmpMat[0] := FOrigin.right.x;
  3.   tmpMat[1] := FOrigin.top.x;
  4.   tmpMat[2] := -FOrigin.front.x;
  5.   tmpMat[3] := 0;
  6.  
  7.   tmpMat[4] := FOrigin.right.y;
  8.   tmpMat[5] := FOrigin.top.y;
  9.   tmpMat[6] := -FOrigin.front.y;
  10.   tmpMat[7] := 0;
  11.  
  12.   tmpMat[8] := FOrigin.right.z;
  13.   tmpMat[9] := FOrigin.top.z;
  14.   tmpMat[10] := -FOrigin.front.z;
  15.   tmpMat[11] := 0;
  16.  
  17.   tmpMat[12] := dot3(FOrigin.pos,smul3(-1,FOrigin.right));
  18.   tmpMat[13] := dot3(FOrigin.pos,smul3(-1,FOrigin.top));
  19.   tmpMat[14] := dot3(FOrigin.pos,FOrigin.front);
  20.   tmpMat[15] := 1;
  21.  


Dateianhänge:
Dateikommentar: von er Seite gesehen stimmts auch nicht
normalen3.jpg
normalen3.jpg [ 33.78 KiB | 7183-mal betrachtet ]
Dateikommentar: etwas von unten betrachtet passte keine der Farben mehr.
normalen2.jpg
normalen2.jpg [ 13.7 KiB | 7183-mal betrachtet ]
Dateikommentar: so wie es immer aussehen sollte
normalen1.jpg
normalen1.jpg [ 24.98 KiB | 7183-mal betrachtet ]

_________________
Klar Soweit?
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jun 21, 2009 18:06 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 04, 2006 12:54
Beiträge: 263
Die Normalmatrix ist die transposed inverse obere/linke 3x3 teil der Modelviematrix, wenn nicht gestaucht/scaliert wird kann es sein, das der 3x3 teil so funktioniert.

_________________
Lumina plattform unabhängige GLSL IDE


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 22, 2009 18:45 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
Okay ich habs! Vorweg entschuldigung fürs quälen mit dieser Frage. Das Problem lag nicht an der Matrix, sondern an den Normalen. Ich habe in dem Modelloader die Formel zur Errechnung der Normalen abgeändert um sie als Farbwerte darstellen zu können. Das Problem war anschließend, das ich diese Normalen, die jetzt falsch waren, zusätzlich mit der NormalMatrix multipliziert habe und anschließend wieder die Verschiebung durchgeführt habe um sie darstellen zu können. Darufhin kam ein totales Kaudawelsch zustande. Das makabere ist, dass ich besagte Codezeile auch noch kommentiert habe mit "An dieser Stelle verschiebe ich die Normalen um sie als Farben zu verwenden UNBEDINGT DRAN DENKEN!!!"... irgendwie peinlich, aber ich bin glücklich, dass es jetzt funktioniert.

_________________
Klar Soweit?


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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.015s | 18 Queries | GZIP : On ]