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

Aktuelle Zeit: Do Mär 28, 2024 17:27

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Jun 29, 2017 17:39 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Mit folgenden Code, will ich die Textur-Koordinaten verschieben.

Rotieren und Skalieren klappt einwandfrei.

Ich denke mal, es hängt irgendwie zusammen, das die Textur-Koordinaten nur ein XY haben.
Egal, was ich für einen Wert ich bei Translate reinschreibe, auch zB. 1'000, alles hat keinen Einfluss.

Vertex-Shader:
Code:
  1. #version 330
  2.  
  3. layout (location = 0) in vec3 inPos;    // Vertex-Koordinaten
  4. layout (location = 10) in vec2 inUV;    // Textur-Koordinaten
  5.  
  6. uniform mat4 mat;
  7. uniform mat3 texMat;
  8.  
  9. out vec2 UV0;
  10.  
  11. void main(void)
  12. {
  13.   gl_Position = mat * vec4(inPos, 1.0);
  14.  
  15.   UV0 = vec2(texMat * vec3(inUV, 1.0));
  16. }  


Fragment-Shader:
Code:
  1. #version 330
  2.  
  3. in vec2 UV0;
  4.  
  5. uniform sampler2D Sampler;            
  6.  
  7. out vec4 FragColor;
  8.  
  9. void main()
  10. {
  11.   FragColor = texture( Sampler, UV0 );
  12. }  


Code:
  1. type
  2.   Tmat3x3 = array[0..2, 0..2] of GLfloat;
  3.   TMatrix2D = class(TObject)  
  4.   private
  5.     FMatrix: TMat3x3;
  6.  
  7. ........
  8.  
  9. procedure TMatrix2D.Translate(x, y: single);
  10. begin
  11.   FMatrix[2, 0] := FMatrix[2, 0] + x;
  12.   FMatrix[2, 1] := FMatrix[2, 1] + y;
  13. end;  


Jemand eine Idee, was für einen Überlegungs-Fehler ich mache ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jun 29, 2017 21:56 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Mit folgender Code-Modifikation, verschiebt sich der Drehpunkt der Textur, aber ich hätte es eigentlich gerne in der Matrix gehabt.
Code:
  1.   UV0 = vec2(texMat * vec3(inUV + vec2(-0.5, -0.5), 1.0));  

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jun 30, 2017 07:50 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
Also ich sehe keinen Fehler. Bist du dir sicher, dass du die Matrix korrekt herum aufbaust und nicht transponiert? Wenn nicht, probiere mal FMatrix[0, 2] statt FMatrix[2, 0]. (Da die letzte Zeile der Matrix auf die Berechnung keinen Einfluss hat, kannst du die Translation hier auch einfach sowohl in die letzte Spalte als auch in die letzte Zeile schreiben.) Wie übergibst du die Matrix an den Shader?

_________________
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  
BeitragVerfasst: Fr Jun 30, 2017 17:16 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich habe gerade festgestellt, wen ich eine reine Verschiebung mache, also ohne Rotation, dann verschiebt sich die Textur.
Mal gucken, ob ich das Problem beheben kann, wen ich für die Translation und Rotierung eine extra Matrix nehme, und dies zum Schluss multipliziere.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jul 07, 2017 20:37 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich konnte den Fehler noch mehr einkreisen.

Ich habe unterdessen für das verschieben und drehen separate Matrizen.
Die Textur wird wohl verschoben, aber der Drehpunkt der Textur ist immer links/unten.

Ändere ich die Texturkoordinaten manuell, als Beispiel, die 0.0 zu -1.0, dann ist der Drehpunkt in der Mitte.

Code:
  1.   TextureVertex: array[0..5] of TVector2f =    // Textur-Koordinaten
  2.     ((0.0, 0.0), (1.0, 1.0), (0.0, 1.0),
  3.     (0.0, 0.0), (1.0, 0.0), (1.0, 1.0));
  4. //  ((-1.0, -1.0), (1.0, 1.0), (-1.0, 1.0),
  5. //  (-1.0, -1.0), (1.0, -1.0), (1.0, 1.0));  


Im Shader habe ich noch folgendes probiert, aber das Ergebnis ist das Gleiche.
Code:
  1. //  UV0 = vec2(texMat * vec3(inUV, 1.0));
  2.   UV0 = (texMat * vec3(inUV, 1.0)).xy;


Wie ich es multipliziere, hat auch keinen Einfluss.
Code:
  1.   texRotMatrix.Push; // Matrix sichern
  2.  
  3.   texRotMatrix.Multiply(texTransMatrix, texRotMatrix);
  4.  
  5.   texRotMatrix.Uniform(texMatrix_ID);
  6.   texRotMatrix.Pop;  // Matrix restaurieren

oder
Code:
  1.   texRotMatrix.Push; // Matrix sichern
  2.  
  3.   texRotMatrix.Multiply(texRotMatrix, texTransMatrix);  // geändert
  4.  
  5.   texRotMatrix.Uniform(texMatrix_ID);
  6.   texRotMatrix.Pop;  // Matrix restaurieren


Ist es überhaupt möglich, dies über die(eine) Matrix zu lösen, oder muss man das Offset separat als x und y int Uniform übergeben ?

_________________
OpenGL


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 12 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.043s | 17 Queries | GZIP : On ]