Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturen und Matrixen
Aus DGL Wiki
Version vom 30. Dezember 2017, 21:19 Uhr von Mathias (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „200px<br><br> =Texturen - Texturen und Matrixen = == Einleitung == Die Textur-Ko…“)
Inhaltsverzeichnis
Texturen - Texturen und Matrixen
Einleitung
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.
}
Autor: Mathias
Siehe auch
- Übersichtseite Lazarus - OpenGL 3.3 Tutorial