Lazarus - OpenGL 3.3 Tutorial - Texturen - 1D Textur: Unterschied zwischen den Versionen
Aus DGL Wiki
(Die Seite wurde neu angelegt: „200px<br><br> =Texturen - 1D Textur = == Einleitung == Die meisten Texturen sind eine Bitmap…“) |
(→Einleitung) |
||
Zeile 63: | Zeile 63: | ||
Shader.UseProgram; | Shader.UseProgram; | ||
− | ProdMatrix | + | ProdMatrix := ScaleMatrix * RotMatrix; |
ProdMatrix.Uniform(Matrix_ID); | ProdMatrix.Uniform(Matrix_ID); | ||
Zeile 73: | Zeile 73: | ||
end;</syntaxhighlight> | end;</syntaxhighlight> | ||
<br><br> | <br><br> | ||
+ | |||
==Vertex-Shader:== | ==Vertex-Shader:== | ||
<br> | <br> |
Aktuelle Version vom 20. Juni 2018, 18:27 Uhr
Inhaltsverzeichnis
Texturen - 1D Textur
Einleitung
Die meisten Texturen sind eine Bitmap(Foto) welche im 2D-Format vorliegen.
Es gibt aber noch 1D und 3D-Texturen. Dieses Beispiel zeigt die Anwendung einer 1D-Textur.
Eine 1D-Textur kann man sich am besten als eine farbige Linie vorstellen.
Die Texturkoordinaten sind nun keine Vectorenarray mehr sondern nur eine einfache Float-Array.
const
QuadVertex: array[0..5] of TVector3f = // Koordinaten der Polygone.
((-0.8, -0.8, 0.0), (0.8, 0.8, 0.0), (-0.8, 0.8, 0.0), (-0.8, -0.8, 0.0), (0.8, -0.8, 0.0), (0.8, 0.8, 0.0));
TextureVertex: array[0..5] of GLfloat =
(0.0, 3.0, 0.0, 0.0, 3.0, 3.0);
Eine Einfache 1D-Textur mit 5 Pixeln.
const
Textur24: packed array[0..4, 0..2] of byte =
(($FF, $00, $00), ($00, $FF, $00), ($00, $00, $FF), ($FF, $FF, $00), ($FF, $FF, $FF));
Generieren des Texturbuffers.
Dies geschieht gleich wie bei der normalen 2D-Textur.
procedure TForm1.CreateScene;
begin
glGenTextures(1, @textureID); // Erzeugen des Textur-Puffer.
Beim laden muss man bei den Textur-Befehlen beachten, das man GL_TEXTURE_1D nimmt.
Beim VertexAttribut wird für die Textur-Koordinaten nur eine Float-Array übergeben.
procedure TForm1.InitScene;
begin
// Textur binden.
glBindTexture(GL_TEXTURE_1D, textureID);
// Textur laden.
glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, 5, 0, GL_RGB, GL_UNSIGNED_BYTE, @Textur24);
// Ein minimalst Filter aktivieren, ansonsten bleibt die Ausgabe schwarz.
glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
// Textur entbinden.
glBindTexture(GL_TEXTURE_1D, 0);
glClearColor(0.6, 0.6, 0.4, 1.0); // Hintergrundfarbe
// Vektorkoordinaten
glBindVertexArray(VBQuad.VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBQuad.VBOVertex);
glBufferData(GL_ARRAY_BUFFER, sizeof(QuadVertex), @QuadVertex, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, False, 0, nil);
// Nur eine Float-Array
glBindBuffer(GL_ARRAY_BUFFER, VBQuad.VBOTex);
glBufferData(GL_ARRAY_BUFFER, sizeof(TextureVertex), @TextureVertex, GL_STATIC_DRAW);
glEnableVertexAttribArray(10);
glVertexAttribPointer(10, 1, GL_FLOAT, False, 0, nil);
end;
Das Zeichnen ist nichts besonderes.
procedure TForm1.ogcDrawScene(Sender: TObject);
begin
glClear(GL_COLOR_BUFFER_BIT);
// Textur binden.
glBindTexture(GL_TEXTURE_1D, textureID);
Shader.UseProgram;
ProdMatrix := ScaleMatrix * RotMatrix;
ProdMatrix.Uniform(Matrix_ID);
// Zeichne Quadrat
glBindVertexArray(VBQuad.VAO);
glDrawArrays(GL_TRIANGLES, 0, Length(QuadVertex));
ogc.SwapBuffers;
end;
Vertex-Shader:
Man beachte, das die UV-Koordinaten nur ein Float ist.
#version 330
layout (location = 0) in vec3 inPos; // Vertex-Koordinaten
layout (location = 10) in float inUV; // Textur-Koordinaten als Float-Array
uniform mat4 mat;
out float UV0;
void main(void)
{
gl_Position = mat * vec4(inPos, 1.0);
UV0 = inUV; // Textur-Koordinaten weiterleiten.
}
Fragment-Shader:
#version 330
in float UV0;
uniform sampler1D Sampler; // Ein 1D-Sampler
out vec4 FragColor;
void main()
{
FragColor = texture( Sampler, UV0 ); // UV0 ist nur ein Float.
}
Autor: Mathias
Siehe auch
- Übersichtseite Lazarus - OpenGL 3.3 Tutorial