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

Aktuelle Zeit: Do Mär 28, 2024 11:58

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Matrix und Normale
BeitragVerfasst: Do Sep 24, 2015 17:06 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Verstehe ich es richtig, wen man es korrekt machen will, das man für die Normale eine Extra-Matrix braucht ?

Angenommen ein Normal Vector hat z.B. den Wert vec3(0.0, 0.0, 1.0);
Wen ich über die WorldMatrix mein Object z.B. um 10.0 im X verschiebe, dann hat die Normale vec3(10.0, 0.0, 1.0) ?

Code:
  1. #version 330
  2.  
  3. layout (location = 0) in vec4 inPos;
  4. layout (location = 1) in vec3 inNormal;
  5. layout (location = 10) in vec2 vertexUV0;
  6. layout (location = 11) in vec2 vertexUV1;
  7.  
  8. uniform mat4 WorldMatrix;
  9.  
  10. out Data {
  11.   vec2 UV0;
  12.   vec2 UV1;
  13.   vec3 normal;
  14.   vec4 eye;
  15. } DataOut;
  16.  
  17.  
  18. void main()
  19. {
  20.   DataOut.UV0 = vertexUV0;
  21.   DataOut.UV1 = vertexUV1;
  22.  
  23.   DataOut.normal = vec3(WorldMatrix * vec4(inNormal, 1.0)); // Das wäre dann falsch
  24.   DataOut.eye = WorldMatrix * inPos;
  25.  
  26.   gl_Position = WorldMatrix * inPos;
  27. }    

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrix und Normale
BeitragVerfasst: Do Sep 24, 2015 18:21 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Nein, die Normalenmatrix ist die invertierte 3×3 ModelView-Matrix. Wichtig ist hier, dass die Translation *nicht* enthalten ist, aber andere Dinge. Ich finde, dieser Artikel hier beschreibt es ganz gut.

viele Grüße,
Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrix und Normale
BeitragVerfasst: Do Sep 24, 2015 19:08 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Meinst du, wen ich den xyz Teil, ohne das w, aus der ModelViewMatrix nehme und diese inventiere, dann kommt es richtig ?

Da sieht man den Fehler mit dem Translate:
Bild

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrix und Normale
BeitragVerfasst: Do Sep 24, 2015 21:31 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
Lord Horazont hat geschrieben:
die Normalenmatrix ist die invertierte 3×3 ModelView-Matrix.
Nein, die Normalenmatrix ist das transponierte des inversen des 3x3-Anteils der Model(View)-Matrix. Wäre ja auch komisch, wenn sich die Normalen andersrum drehen würden, als die Raumkoordinaten. Solange man auf Skalierung in der Matrix verzichtet, muss man daraus aber keine Wissenschaft machen und kann einfach die die Model(View)-Matrix nehmen und jeweils die letzte Zeile und Spalte streichen - fertig ist die NormalMatrix! Mir kommt die Diskussion irgendwie bekannt vor...

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrix und Normale
BeitragVerfasst: Do Sep 24, 2015 22:13 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Solange man auf Skalierung in der Matrix verzichtet, muss man daraus aber keine Wissenschaft machen und kann einfach die die Model(View)-Matrix nehmen und jeweils die letzte Zeile und Spalte streichen

Wen ich alle 3 Achsen gleichzeitig mit dem gleichen Wert skaliere, müsste es trotzdem gehen, oder täusche ich mich da ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrix und Normale
BeitragVerfasst: Do Sep 24, 2015 22:49 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
Jein. Die Normalen sollen für die Lichtberechnung ja die Länge 1 haben. Also müsstest du dann nach der Transformation noch durch deinen Skalierungsfaktor teilen. Je nachdem, wie deine Lichtberechnung aussieht, kannst du dir das aber u.U. auch wieder sparen. Also wenn du z.B. die Normalen erst im Fragmentshader brauchst, sie dort aber sowieso erstmal normalisiert werden und auf jeden Vertex die gleiche Normalmatrix angewendet wird.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrix und Normale
BeitragVerfasst: Fr Sep 25, 2015 09:32 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ah, stimmt, transponieren kommt noch dazu, und das erklärt warum das Beispiel, das ich schreiben wollte, nicht funktioniert hat :).

Natürlich kannst du dir den ganzen Zirkus sparen, wenn du keine Skalierung hast. Aber im Allgemeinen Fall, mit Skalierung und vor allem beliebiger Skalierung in Richtungen ist es halt nötig, diese Transformation zu machen.

viele Grüße,
Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrix und Normale
BeitragVerfasst: Fr Sep 25, 2015 09:55 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
Hmm... wenn ich so darüber nachdenke, muss man eigentlich immer normalisieren, wenn man Skalierung hat. Angenommen man skaliert mit dem Faktor 3, dann skaliert die inverse Matrix mit 1/3 und auch die transponierte Inverse Matrix tut das noch. Oder mache ich jetzt einen Denkfehler?

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Matrix und Normale
BeitragVerfasst: Fr Sep 25, 2015 17:22 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Momentan verwende ich folgende Shader-Kombination, wen nur eine Textur und Lighting verwendete wird.

Ist die Berechnung der Normalen richtig ?
ObjectMatrix ist im Pascal-Teil mit WorldMatrix multipliziert.
CameraMatrix mit WorldMatrix und ObjectMatrix.

Wie sieht es im Frament-Shader aus,, ist die Lcihtberechnug so richtig, oder würdet ihr das anders machen ?



Vertex:
Code:
  1. #version 330
  2.  
  3. layout (location = 0) in vec3 inPos;
  4. layout (location = 1) in vec3 inNormal;
  5. layout (location = 10) in vec2 inVertexUV;
  6.  
  7. out Data {
  8.   vec3 Position;
  9.   vec3 Normal;
  10.   vec2 UV;
  11. } DataOut;
  12.  
  13. uniform mat4 CameraMatrix;
  14. uniform mat4 ObjectMatrix;
  15.  
  16. void main()
  17. {
  18.   gl_Position = CameraMatrix * vec4(inPos, 1.0);
  19.   DataOut.UV = inVertexUV;
  20.   DataOut.Position = vec3(ObjectMatrix * vec4(inPos, 1.0));
  21.   DataOut.Normal = normalize(mat3(ObjectMatrix) * inNormal);
  22. }
  23.  


Fragment:

Code:
  1. #version 330
  2.  
  3. in Data {
  4.   vec3 Position;
  5.   vec3 Normal;
  6.   vec2 UV;
  7. } DataIn;
  8.  
  9. out vec4 OutColor;
  10.  
  11. uniform sampler2D myTextureSampler[4];
  12.  
  13.     struct materialParams {
  14.        vec4 emission;
  15.        vec4 ambient;
  16.        vec4 diffuse;
  17.        vec4 specular;
  18.        float shininess;     // Glanz
  19.     };
  20.  
  21.     struct Lighting {
  22.       vec4 position;
  23.       vec4 ambient;    // Umgebungslicht
  24.       vec4 diffuse;    // Lichtfarbe
  25.       vec4 specular;   // Spiegelnd
  26.     };
  27.  
  28.     uniform materialParams Material;
  29.     uniform Lighting LightSource;
  30.  
  31.     vec4 Light(in vec3 Normal, in vec3 Position)
  32.     {
  33.       vec3 N       = normalize(Normal);
  34.       vec4 emissiv = Material.emission;
  35.       vec4 ambient = Material.ambient * LightSource.ambient;
  36.       vec3 L = vec3(0.0);
  37.       vec3 H = vec3(0.0);
  38.       L            = normalize(vec3(LightSource.position) - Position);
  39.       vec4 Pos_eye = vec4(0.0, 0.0, 1.0, 0.0);
  40.       vec3 A       = Pos_eye.xyz;
  41.       H            = normalize(L + A);
  42.       vec4 diffuse       = vec4(0.0, 0.0, 0.0, 1.0);
  43.       vec4 specular      = vec4(0.0, 0.0, 0.0, 1.0);
  44.       float diffuseLight = max(dot(N, L), 0.0);
  45.       if (diffuseLight > 0.0) {
  46.         diffuse         = diffuseLight * Material.diffuse * LightSource.diffuse;
  47.         float specLight = pow(max(dot(H, N), 0.0), Material.shininess);
  48.         specular        = specLight * Material.specular * LightSource.specular;
  49.       }
  50.       return emissiv + ambient + diffuse + specular;
  51.     }
  52.  
  53. void main() {
  54.   OutColor = (texture( myTextureSampler[0], DataIn.UV ));
  55.   float cdummy = OutColor.a;
  56.   OutColor = OutColor * Light(DataIn.Normal, DataIn.Position);
  57.   OutColor.a = cdummy;
  58. }

_________________
OpenGL


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 » Mathematik-Forum


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 14 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.356s | 17 Queries | GZIP : On ]