DGL
https://delphigl.com/forum/

Textur-Koordinaten rotieren ( OpenGL 3.3 )
https://delphigl.com/forum/viewtopic.php?f=20&t=11596
Seite 1 von 1

Autor:  mathias [ Do Jun 29, 2017 17:39 ]
Betreff des Beitrags:  Textur-Koordinaten rotieren ( OpenGL 3.3 )

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 ?

Autor:  mathias [ Do Jun 29, 2017 21:56 ]
Betreff des Beitrags:  Re: Textur-Koordinaten rotieren ( OpenGL 3.3 )

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));  

Autor:  glAwesome [ Fr Jun 30, 2017 07:50 ]
Betreff des Beitrags:  Re: Textur-Koordinaten rotieren ( OpenGL 3.3 )

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?

Autor:  mathias [ Fr Jun 30, 2017 17:16 ]
Betreff des Beitrags:  Re: Textur-Koordinaten rotieren ( OpenGL 3.3 )

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.

Autor:  mathias [ Fr Jul 07, 2017 20:37 ]
Betreff des Beitrags:  Re: Textur-Koordinaten rotieren ( OpenGL 3.3 )

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 ?

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