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

Aktuelle Zeit: Do Mär 28, 2024 23:37

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



Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Verschiedene Matrix, wie bennen
BeitragVerfasst: Di Dez 24, 2013 17:09 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
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 | 12353-mal betrachtet ]

_________________
OpenGL
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verschiedene Matrix, wie bennen
BeitragVerfasst: Di Dez 24, 2013 22:18 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
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.


Zuletzt geändert von OpenglerF am So Dez 29, 2013 15:02, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verschiedene Matrix, wie bennen
BeitragVerfasst: Sa Dez 28, 2013 17:53 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
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.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verschiedene Matrix, wie bennen
BeitragVerfasst: Sa Dez 28, 2013 22:37 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Ja, du hast mich richtig verstanden. Möglicherweise auch in der genau gegenteiligen Reihenfolge, da bin ich mir immer nicht ganz sicher...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verschiedene Matrix, wie bennen
BeitragVerfasst: Sa Dez 28, 2013 23:02 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Wen ich mein Code angucke, müsste die Reihenfolge stimmen, dort ist die Camera links, diese muss er zuletzt multipizieren.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verschiedene Matrix, wie bennen
BeitragVerfasst: So Dez 29, 2013 00:33 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
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.

_________________
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: Verschiedene Matrix, wie bennen
BeitragVerfasst: So Dez 29, 2013 13:22 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verschiedene Matrix, wie bennen
BeitragVerfasst: So Dez 29, 2013 13:58 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
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).

_________________
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: Verschiedene Matrix, wie bennen
BeitragVerfasst: So Dez 29, 2013 14:37 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Die Matrizen im Shader zu multiplizieren ist doch unnötig. Man kann sie doch eben auch ganz einfach hintereinander anwenden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verschiedene Matrix, wie bennen
BeitragVerfasst: So Dez 29, 2013 14:45 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
Ja. mathias hatte aber geschrieben:
mathias hat geschrieben:
Der Shader sollte dann nur noch Kameramatrix und Modelmatrix multiplizieren.
Dem wollte ich eigentlich nur widersprechen.

_________________
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: Verschiedene Matrix, wie bennen
BeitragVerfasst: So Jan 19, 2014 17:39 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
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. }        

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verschiedene Matrix, wie bennen
BeitragVerfasst: So Jan 19, 2014 18:02 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verschiedene Matrix, wie bennen
BeitragVerfasst: So Jan 19, 2014 18:36 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Pro-jection Matrix?

_________________
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: Verschiedene Matrix, wie bennen
BeitragVerfasst: So Jan 19, 2014 18:39 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Verschiedene Matrix, wie bennen
BeitragVerfasst: So Jan 19, 2014 18:50 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
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.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 11 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.134s | 19 Queries | GZIP : On ]