DGL
https://delphigl.com/forum/

Verschiedene Matrix, wie bennen
https://delphigl.com/forum/viewtopic.php?f=20&t=11054
Seite 1 von 2

Autor:  mathias [ Di Dez 24, 2013 17:09 ]
Betreff des Beitrags:  Verschiedene Matrix, wie bennen

Was für Namen würdet ich für die Matrixen verwenden ?
Ich will meine Fantasynamen loswerden.
CameraMatrix ist klar.


LocalMatrix verwende ich, wen ich Einzelelemente, in meinem Beispiel, der Rote und Weise Halbzylinder zusammen fügen will, die Matrix wird dabei um 180° gedreht.
meinMatrix dreht den ganzen Zylinder.

CameraMatrix dreht das ganze Gebilde, wobei das Licht nicht verändert werden darf.

vecColor ist auch so ein Fantasyname.

Code:
  1. #version 330
  2. in vec3 inPos;
  3. in vec4 inColor;
  4. in vec3 inNormal;
  5.  
  6. uniform mat4 LocalMatrix;
  7. uniform mat4 meinMatrix;
  8. uniform mat4 CameraMatrix;
  9. uniform vec4 VecColor;
  10.  
  11. out vec3 Pos;
  12. out vec4 Color;
  13. out vec3 Normal;
  14.  
  15. void main()
  16. {
  17.   Pos = vec3(meinMatrix * LocalMatrix * vec4(inPos, 1.0));
  18.   Normal = mat3(meinMatrix * LocalMatrix) * inNormal;
  19.  
  20.   gl_Position = CameraMatrix * meinMatrix * LocalMatrix * vec4(inPos, 1.0);
  21.  
  22.   Color = VecColor;
  23. }        


Dateianhänge:
Zwischenablage-1.jpg
Zwischenablage-1.jpg [ 4.83 KiB | 15240-mal betrachtet ]

Autor:  OpenglerF [ Di Dez 24, 2013 22:18 ]
Betreff des Beitrags:  Re: Verschiedene Matrix, wie bennen

Die ganzen Matrizen solltest du eh besser auf der CPU ausrechnen und nur eine fertige, höchstens zwei auf der GPU berechnen. Denke daran: Die Grafikkarte muss den Shader für jeden Vertex bzw. Fragment ausführen!
In der Regel hat man eine Kameramatrix und eine Modelmatrix.
Die Modellmatrix transformiert die Vertices vom Modelspace(Dem Koordinatensystem eines Modells, also ein Teil der "Welt") in den Worldspace(Die globalen Koordinaten so wie alles tatsächlich im Raum angeordnet ist.).
Die Kameramatrix bildet anschließend die Weltkoordinaten auf die Kameraebene ab.

Den Sinn von "meinMatrix", "LocalMatrix" habe ich nicht ganz verstanden.
In der Praxis werden in den meisten zeitgemäßen Engines (zb. Unity) alle Objekte/Modelle in einen Scenegraph hierarchisch verwaltet. Ein Beispiel: (Ausgedacht und nicht total realistisch. Zb. bei den einzelnen Dachziegeln... Ist aber auch nur zur Veranschaulichung)
Code:
  1.  
  2. Welt
  3.  ├ Haus0
  4.  │ ├ Tür
  5.  │ │ ├ Klinke
  6.  │ │ └ Holz
  7.  │ ├ Kamin
  8.  │ │ └ Rauch
  9.  │ ├ Betonwand
  10.  │ └ Dach
  11.  │   ├ Dachziegel0
  12.  │   ├ Dachziegel1
  13.  │   ├ Dachziegel2
  14.  │   ├     ...
  15.  │   └ Dachziegel235
  16.  └ Haus1
  17.    ├ Fenster
  18.    │ ├ Fensterrahmen
  19.    │ └ Fensterscheibe
  20.    ├ Kamin
  21.    │ └ Rauch
  22.    ├ Glaswand
  23.    └ Flachdach
  24.  

Die einzelnen Objekte in der Welt sind also in einer Baumartigen Datenstruktur abgelegt, wie die Dateien auf deiner Festplatte. Jedes der einzelnen Objekte hat eine Matrix und kann verschoben, rotiert, skaliert, geschert oder was auch immer werden. Um die Modelmatrix rauszubekommen um jetzt ein einzelnes beliebiges Objekt aus dem Scenegraph zu rendern, muss nun einfach die Matrix eines Objektes mit allen Matrizen der Elternelemente multipliziert werden. Man kann nun das Fenster von "Haus1" ganz einfach verschieben, in dem man die Matrix dieses einen Objektes verändert. Die "Bauteile" des Fensters, also das Modell des Fensterrahmens und der Fensterscheibe bewegen sich automatisch mit. Weil ich es nicht ganz verstanden habe, was du mit "MeinerMatrix" und "LocalMatrix" bezwecken willst, bin ich mir nicht ganz sicher, aber ich denke, du willst etwas umsetzen, das so ähnlich wie das funktioniert.
Nur mal so nebenbei: "Denglisch" im Programmcode ist unübersichtlich.

Autor:  mathias [ Sa Dez 28, 2013 17:53 ]
Betreff des Beitrags:  Re: Verschiedene Matrix, wie bennen

Wen ich dich richtig verstanden habe, sollte ich
Modelmatrix = Welt * Haus0 * Dach * Dachziegel0 mit der CPU rechen.
Der Shader sollte dann nur noch Kameramatrix und Modelmatrix multiplizieren.
Zusammenfügen macht da keinen Sinn, weil es wegen der Beleuchtung die Modelmatrix seperat braucht.

Autor:  OpenglerF [ Sa Dez 28, 2013 22:37 ]
Betreff des Beitrags:  Re: Verschiedene Matrix, wie bennen

Ja, du hast mich richtig verstanden. Möglicherweise auch in der genau gegenteiligen Reihenfolge, da bin ich mir immer nicht ganz sicher...

Autor:  mathias [ Sa Dez 28, 2013 23:02 ]
Betreff des Beitrags:  Re: Verschiedene Matrix, wie bennen

Wen ich mein Code angucke, müsste die Reihenfolge stimmen, dort ist die Camera links, diese muss er zuletzt multipizieren.

Autor:  glAwesome [ So Dez 29, 2013 00:33 ]
Betreff des Beitrags:  Re: Verschiedene Matrix, wie bennen

mathias hat geschrieben:
Der Shader sollte dann nur noch Kameramatrix und Modelmatrix multiplizieren.
Zusammenfügen macht da keinen Sinn, weil es wegen der Beleuchtung die Modelmatrix seperat braucht.
Zusammenfügen von Kamera- und Modelmatrix auf der CPU macht durchaus Sinn. Schließlich ändert sich das Produkt der beiden Matrizen (nennen wir es KameraModelMatrix) nicht für jeden Vertex. Es hindert dich keiner daran, sowohl die Modelmatrix, als auch die KameraModelMatrix an den Shader zu übergeben.

Autor:  OpenglerF [ So Dez 29, 2013 13:22 ]
Betreff des Beitrags:  Re: Verschiedene Matrix, wie bennen

Naja, den großen Unterschied sehe ich gerade nicht:

Code:
  1. WorldPosition = WorldMatrix * LocalPosition;
  2. CameraPosition = CameraMatrix * WorldPosition:

vs.
Code:
  1. WorldPosition = WorldMatrix * LocalPosition;
  2. CameraPosition = WorldCameraMatrix * LocalPosition:


Auf jedenfall sollten nicht grundsätzlich mehr Berechnungen anfallen. Außer auf der CPU bei der vormultiplizierten Variente und das in jedem Frame, weil die Kameraposition sich recht häufig ändern dürfte.

Autor:  glAwesome [ So Dez 29, 2013 13:58 ]
Betreff des Beitrags:  Re: Verschiedene Matrix, wie bennen

So wie du es geschrieben hast, mutliplizierst du ja auch nicht die Matrizen im Shader.

Code:
  1. WorldPosition = WorldMatrix * LocalPosition;
  2. mat4 WorldCameraMatrix = CameraMatrix * WorldMatrix;
  3. CameraPosition =  WorldCameraMatrix * LocalPosition;
Das wäre schon aufwändiger (wenn der Compiler es nicht ohnehin wegoptimiert).

Autor:  OpenglerF [ So Dez 29, 2013 14:37 ]
Betreff des Beitrags:  Re: Verschiedene Matrix, wie bennen

Die Matrizen im Shader zu multiplizieren ist doch unnötig. Man kann sie doch eben auch ganz einfach hintereinander anwenden.

Autor:  glAwesome [ So Dez 29, 2013 14:45 ]
Betreff des Beitrags:  Re: Verschiedene Matrix, wie bennen

Ja. mathias hatte aber geschrieben:
mathias hat geschrieben:
Der Shader sollte dann nur noch Kameramatrix und Modelmatrix multiplizieren.
Dem wollte ich eigentlich nur widersprechen.

Autor:  mathias [ So Jan 19, 2014 17:39 ]
Betreff des Beitrags:  Re: Verschiedene Matrix, wie bennen

Unterdessen habe ich meinen Vertex-Shader von den Matrix-Multiplikationen entrümpelt.
Sieht doch schon viel besser aus. :wink:
Code:
  1. #version 330
  2. in vec3 inPos;
  3. in vec3 inNormal;
  4.  
  5. uniform mat4 ProMatrix;
  6. uniform mat4 CameraMatrix;
  7. uniform vec4 VecColor;
  8.  
  9. out vec3 Pos;
  10. out vec4 Color;
  11. out vec3 Normal;
  12.  
  13. void main()
  14. {
  15.   Pos = vec3(ProMatrix *  vec4(inPos, 1.0));
  16.   Normal = mat3(ProMatrix) * inNormal;
  17.  
  18.   gl_Position = CameraMatrix * vec4(inPos, 1.0);
  19.  
  20.   Color = VecColor;
  21. }        

Autor:  OpenglerF [ So Jan 19, 2014 18:02 ]
Betreff des Beitrags:  Re: Verschiedene Matrix, wie bennen

Schon viel besser. :D
Bei nicht perspektivischen Transformationen ist es zwar ohne Effekt, aber eigentlich solltest du die 4. Komponente nicht verwerfen, sondern du müsstest eine perspektivische Division durchführen.

Code:
  1. vec4 TempPos = ProMatrix *  vec4(inPos, 1.0);
  2. Pos = TempPos.xyz / TempPos.w;


Nebenbei: Weil der Name des Themas immer noch so heißt: Was soll eigentlich eine "ProMatrix" sein? Es klingt für mich so, als ob es auche eine "ContraMatrix" gäbe... Ich habe echt keine Ahnung was da "pro" sein sollte. Eigentlich ist es auf jedenfall die "Worldmatrix" oder "Modelmatrix". "Pos" darfst du auch ruhig "PosWorld" nennen oder so. Sonst weißt du irgendwann nicht mehr, in welchen Koordinatensystem die Position jetzt war. Besonders wenn der Shader irgendwann mal weiter ausgebaut wird.

Autor:  Lord Horazont [ So Jan 19, 2014 18:36 ]
Betreff des Beitrags:  Re: Verschiedene Matrix, wie bennen

Pro-jection Matrix?

Autor:  OpenglerF [ So Jan 19, 2014 18:39 ]
Betreff des Beitrags:  Re: Verschiedene Matrix, wie bennen

Stimmt, könnte sein.
Das wäre jedoch falsch. Die Projektion ist in der Regel Teil der Kameramatrix.
Hier ist jedenfalls offensichtlich die Weltmatrix gemeint.
Er gibt die Position ja an den Fragmentshader weiter um Lichtberechnungen auszuführen.
Da vorher die Projektion auszuführen wäre Quatsch. Außerdem theoretisch dann doch auch erst Kamera und dann Projektion. Und die Weltmatrix würde ganz fehlen.

Autor:  mathias [ So Jan 19, 2014 18:50 ]
Betreff des Beitrags:  Re: Verschiedene Matrix, wie bennen

Soll ich als die ProMatrix in WorldMatrix umbennen ?

Und dies einbauen, später will ich schon noch perspektivische Darstellungen.
Code:
  1. vec4 TempPos = ProMatrix *  vec4(inPos, 1.0);
  2. Pos = TempPos.xyz / TempPos.w;


Und Pos in PosWorld umbenennen.

Seite 1 von 2 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/