08 - Texturen

10 - Texturen und Matrixen

Selfhtml

Die Textur-Koordinaten kann man im Shader auch mit einer Matrix multipizieren.
Dies geschieht ähnlich, wie bei den Vertex-Koordinanten, der grösste Unterschied dabei ist, das es sich um 2D-Koordinaten handelt.

Das Translate ist noch fehlerhaft !!!!!


procedure TForm1.InitScene;
begin
  Textur.LoadTextures('mauer.bmp');
Matrizen multiplizieren und den Shader übergeben.
procedure TForm1.ogcDrawScene(Sender: TObject);
begin
  glClear(GL_COLOR_BUFFER_BIT);
  Textur.ActiveAndBind;
  Shader.UseProgram;

  ScaleMatrix.Uniform(Matrix_ID);  // Matrix für die Vektoren.

  // --- Texturmatrizen multiplizieren und übergeben.
  texRotMatrix.Push;                                    // texRotMatrix sichern.
  texRotMatrix.Multiply(texTransMatrix, texRotMatrix);  // multiplizieren
  texRotMatrix.Uniform(texMatrix_ID);                   // Dem Shader übergeben.
  texRotMatrix.Pop;                                     // Gersicherte Matrix laden.

  // --- Zeichne Quadrat
  glBindVertexArray(VBQuad.VAO);
  glDrawArrays(GL_TRIANGLES, 0, Length(QuadVertex));

  ogc.SwapBuffers;
end;
Berechnen der Matrix-Bewegungen.
procedure TForm1.Timer1Timer(Sender: TObject);
const
  sstep = 1.03;  // Schritt für Skalierung
  rstep = 0.01;  // Schritt für Rotation

  winkel: single = 0.0;
begin
  with TexturTransform do begin
    if direction then begin
      scale *= sstep;
      if scale > 15.0 then begin
        direction := False;
      end;
    end else begin
      scale /= sstep;
      if scale < 1.0 then begin
        direction := True;
      end;
    end;

    winkel := winkel + rstep;
    if winkel > 2 * pi then begin
      winkel := winkel - 2 * pi;
    end;

    texRotMatrix.Identity;        // Matrix manipulieren.
    texRotMatrix.Scale(scale);
    texRotMatrix.Rotate(winkel);
  end;
  ogcDrawScene(Sender);
end;


Vertex-Shader:
#version 330

layout (location = 0) in vec3 inPos;    // Vertex-Koordinaten
layout (location = 10) in vec2 inUV;    // Textur-Koordinaten

uniform mat4 mat;
uniform mat3 texMat;

out vec2 UV0;

void main(void)
{
  gl_Position = mat * vec4(inPos, 1.0);

//  UV0 = vec2(texMat * vec3(inUV + vec2(-0.5, -0.5), 1.0));
//  UV0 = vec2(texMat * vec3(inUV, 1.0));
  UV0 = (texMat * vec3(inUV, 1.0)).xy;
}


Fragment-Shader:
#version 330

in vec2 UV0;

uniform sampler2D Sampler;              // Der Sampler welchem 0 zugeordnet wird.

out vec4 FragColor;

void main()
{
  FragColor = texture( Sampler, UV0 );  // Die Farbe aus der Textur anhand der Koordinten auslesen.
}



zurück