Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array einzel Bitmap: Unterschied zwischen den Versionen
Aus DGL Wiki
(Die Seite wurde neu angelegt: „200px<br><br> =Texturen - Textur Array einzel Bitmap = == Einleitung == Man…“) |
(kein Unterschied)
|
Version vom 9. Mai 2018, 21:14 Uhr
Inhaltsverzeichnis
Texturen - Textur Array einzel Bitmap
Einleitung
Man kann auch in jedem Layer einzel die Texturn laden.
Der einzige Unterschied zum kompletten laden ist, man ladetdie Texturen einzeln mit SubImage hoch.
Der Rest ist gleich, wie wen man alles miteinander hoch ladet.
Mit glTexImage3D(... wird nur der Speicher für die Texturen reserviert. Dabei muss man von Anfang an wissen, wie gross die Texturen sind.
Mit glTexSubImage3D(... werden dann die Texturn Layer für Layer hochgeladen.
Die sechs einelnen Bitmap heisen 1.xpm - 6.xpm .
procedure TForm1.InitScene;
const
size = 8; // Grösse der Texturen
anzLayer = 6;
var
i: integer;
bit: TPicture; // Bitmap
begin
bit := TPicture.Create;
with bit do begin
glBindTexture(GL_TEXTURE_2D_ARRAY, textureID);
// Speicher reservieren
glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGB, size, size, anzLayer, 0, GL_BGR, GL_UNSIGNED_BYTE, nil);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
for i := 0 to anzLayer - 1 do begin
// Bitmap von HD laden.
LoadFromFile(IntToStr(i + 1) + '.xpm'); // Die Images laden.
// Texturen hoch laden
glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, i, Width, Height, 1, GL_BGR, GL_UNSIGNED_BYTE, Bitmap.RawImage.Data);
end;
glBindTexture(GL_TEXTURE_2D_ARRAY, 0);
Free; // Picture frei geben.
end;
Die Shader sind gleich, wie wen man alles auf einmal hoch ladet.
Vertex-Shader:
#version 330
layout (location = 0) in vec3 inPos; // Vertex-Koordinaten
layout (location = 10) in vec2 inUV; // Textur-Koordinaten
uniform mat4 mat;
out vec2 UV0;
void main(void)
{
gl_Position = mat * vec4(inPos, 1.0);
UV0 = inUV; // Textur-Koordinaten weiterleiten.
}
Fragment-Shader:
#version 330
in vec2 UV0;
uniform sampler2DArray Sampler;
uniform int Layer;
out vec4 FragColor;
void main()
{
FragColor = texture( Sampler, vec3(UV0, Layer));
}
Autor: Mathias
Siehe auch
- Übersichtseite Lazarus - OpenGL 3.3 Tutorial