Lazarus - OpenGL 3.3 Tutorial - Texturen - Textur Array einzel Bitmap: Unterschied zwischen den Versionen
Aus DGL Wiki
K (→Einleitung) |
K |
||
(Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt) | |||
Zeile 2: | Zeile 2: | ||
=Texturen - Textur Array einzel Bitmap = | =Texturen - Textur Array einzel Bitmap = | ||
== Einleitung == | == Einleitung == | ||
− | Man kann auch in jedem Layer einzeln die | + | Man kann auch in jedem Layer einzeln die Texturen laden.<br> |
− | Der einzige Unterschied zum kompletten laden ist, man | + | Der einzige Unterschied zum kompletten laden ist, man ladet die Texturen einzeln mit SubImage hoch.<br> |
Der Rest ist gleich, wie wen man alles miteinander hoch ladet.<br> | Der Rest ist gleich, wie wen man alles miteinander hoch ladet.<br> | ||
<br><br> | <br><br> | ||
Mit '''glTexImage3D(...''' wird nur der Speicher für die Texturen reserviert. Dabei muss man von Anfang an wissen, wie gross die Texturen sind.<br> | Mit '''glTexImage3D(...''' wird nur der Speicher für die Texturen reserviert. Dabei muss man von Anfang an wissen, wie gross die Texturen sind.<br> | ||
− | Mit '''glTexSubImage3D(...''' werden dann die | + | Mit '''glTexSubImage3D(...''' werden dann die Texturen Layer für Layer hochgeladen.<br> |
− | Die sechs | + | Die sechs einzelnen Bitmap heisen 1.xpm - 6.xpm .<br> |
<syntaxhighlight lang="pascal">procedure TForm1.InitScene; | <syntaxhighlight lang="pascal">procedure TForm1.InitScene; | ||
const | const |
Aktuelle Version vom 12. August 2018, 17:50 Uhr
Inhaltsverzeichnis
Texturen - Textur Array einzel Bitmap
Einleitung
Man kann auch in jedem Layer einzeln die Texturen laden.
Der einzige Unterschied zum kompletten laden ist, man ladet die 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 Texturen Layer für Layer hochgeladen.
Die sechs einzelnen 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