Lazarus - OpenGL 3.3 Tutorial - Texturen - Multitexturing
Aus DGL Wiki
Version vom 21. Januar 2018, 19:05 Uhr von Mathias (Diskussion | Beiträge)
Inhaltsverzeichnis
Texturen - Texturen Perspektiven-Korrektur
Einleitung
Für sehr einfache Texturen, ist das xpm-Format geeignet. Mit diesem kann man sehr schnell eine einfache Textur mit einem Text-Editor erstellen.
Da etwas anderes als BMP gleaden wird, muss anstelle von TBitmap TPicture verwendet werden.
Momentan kann TPicture folgende Datei-Formate laden: BMP, GIF, JPG, PCX, PNG, P?M, PDS, TGA, TIF, XPM, ICO, CUR, ICNS.
procedure TForm1.InitScene;
var
pic: TPicture;
i: integer;
begin
glClearColor(0.6, 0.6, 0.4, 1.0);
glBindVertexArray(VBO_Trapeze.VAO);
// Vektoren Trapez
glBindBuffer(GL_ARRAY_BUFFER, VBO_Trapeze.VBO.Vertex);
glBufferData(GL_ARRAY_BUFFER, sizeof(TrapezeVertex), @TrapezeVertex, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, False, 0, nil);
// Unkorrigierte Textur-Koordinaten
glBindBuffer(GL_ARRAY_BUFFER, VBO_Trapeze.VBO.Textur[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(TextureNormalVertex), @TextureNormalVertex, GL_STATIC_DRAW);
glEnableVertexAttribArray(10);
glVertexAttribPointer(10, 2, GL_FLOAT, False, 0, nil);
// Perspektivenkorrigiert Variante 1
glBindBuffer(GL_ARRAY_BUFFER, VBO_Trapeze.VBO.Textur[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(TexturePerspVertex1), @TexturePerspVertex1, GL_STATIC_DRAW);
glEnableVertexAttribArray(11);
glVertexAttribPointer(11, 3, GL_FLOAT, False, 0, nil);
// Perspektivenkorrigiert Variante 2
glBindBuffer(GL_ARRAY_BUFFER, VBO_Trapeze.VBO.Textur[2]);
glBufferData(GL_ARRAY_BUFFER, sizeof(TexturePerspVertex2), @TexturePerspVertex2, GL_STATIC_DRAW);
glEnableVertexAttribArray(12);
glVertexAttribPointer(12, 4, GL_FLOAT, False, 0, nil);
Vertex-Shader:
#version 330
layout (location = 0) in vec3 inPos; // Vertex-Koordinaten
layout (location = 10) in vec2 inUV0; // Textur-Koordinaten
layout (location = 11) in vec3 inUV1; // Textur-Koordinaten
layout (location = 12) in vec4 inUV2; // Textur-Koordinaten
uniform mat4 mat;
out Data {
vec2 UV0;
out vec3 UV1;
out vec4 UV2;
} DataOut;
void main(void)
{
gl_Position = mat * vec4(inPos, 1.0);
DataOut.UV0 = inUV0; // Textur-Koordinaten weiterleiten.
DataOut.UV1 = inUV1, // Textur-Koordinaten weiterleiten.
DataOut.UV2 = inUV2; // Textur-Koordinaten weiterleiten.
}
Fragment-Shader:
#version 330
in Data {
vec2 UV0;
in vec3 UV1;
in vec4 UV2;
} DataIn;
uniform sampler2D Sampler; // Textursampler
uniform int variante; // Variante der Texturberechnung
out vec4 FragColor;
void main()
{
switch (variante) {
// Unkorrigiert
case 0: FragColor = texture( Sampler, DataIn.UV0 );
break;
// Korrigiert Variante 1
case 1: FragColor = texture( Sampler, DataIn.UV1.xy / DataIn.UV1.z );
break;
// Korrigiert Variante 2
case 2: FragColor = texture2DProj( Sampler, DataIn.UV2 );
}
}
mauer.xpm:
/* XPM */
static char *XPM_mauer[] = {
"8 8 2 1",
" c #882222",
"* c #442222",
"********",
"* * ",
"* * ",
"* * ",
"********",
" * * ",
" * * ",
" * * "
};
Autor: Mathias
Siehe auch
- Übersichtseite Lazarus - OpenGL 3.3 Tutorial