Lazarus - OpenGL 3.3 Tutorial - Texturen - Texturn austauschen, Auschnitt laden: Unterschied zwischen den Versionen
Aus DGL Wiki
(Die Seite wurde neu angelegt: „200px<br><br> =Texturen - Texturn austauschen, Auschnitt laden =…“) |
|||
Zeile 60: | Zeile 60: | ||
<syntaxhighlight lang="glsl">#version 330 | <syntaxhighlight lang="glsl">#version 330 | ||
− | layout (location = 0) in vec3 inPos; // Vertex-Koordinaten | + | layout (location = 0) in vec3 inPos; // Vertex-Koordinaten |
− | layout (location = 10) in vec2 inUV; // Textur-Koordinaten | + | layout (location = 10) in vec2 inUV; // Textur-Koordinaten |
uniform mat4 mat; | uniform mat4 mat; | ||
Zeile 69: | Zeile 69: | ||
{ | { | ||
gl_Position = mat * vec4(inPos, 1.0); | gl_Position = mat * vec4(inPos, 1.0); | ||
− | UV0 = inUV; | + | UV0 = inUV; |
} | } | ||
</syntaxhighlight> | </syntaxhighlight> |
Version vom 15. August 2018, 22:56 Uhr
Inhaltsverzeichnis
Texturen - Texturn austauschen, Auschnitt laden
Einleitung
Es ist möglich sehr schnell die Daten des Texturpuffers auszutauschen.
Dies ist auch mit einem Texturauschnitt möglich.
Dies geschieht mit glTexSubImage2D(....
Big ist die Totalgrösse der Texturdaten.
Small ist ein Auschnitt.
const
TextursizeBig = 256;
TextursizeSmall = 64;
3 Datenpuffer, welche sehr mit sehr einfachen Werten geladen werden.
var
TexturBig: packed array [0..TextursizeBig*TextursizeBig-1] of UInt32 ;
TexturSmall0, TexturSmall1: packed array [0..TextursizeSmall*TextursizeSmall-1]of UInt32;
textureID: GLuint;
Es werden sehr einfache Datenbuffer mit Daten befüllt.
In der Praxis werden die Puffer meistens mit Bitmaps gefüllt.
Der grosse Texturbuffer füllt die ganze Textur auf.
Die kleinen Datenbuffer werden später zur Laufzeit abwechslungsweise geladen.
procedure TForm1.InitScene;
var
i: integer;
begin
// Einfache Datenbuffer erzeugen.
for i := 0 to TextursizeBig * TextursizeBig - 1 do begin
TexturBig[i] := i or $FF000000;
end;
for i := 0 to TextursizeSmall * TextursizeSmall - 1 do begin
TexturSmall0[i] := i or $FF000000;
TexturSmall1[i] := (not i) or $FF000000;
end;
// --- Texturbuffer erzeugen und anschliessend mit Daten der grossen Textur befüllen.
glGenTextures(1, @textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
// Nur Speicher reservieren
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TextursizeBig, TextursizeBig, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil);
// Texturbuffer mit dem grossen Datenbuffer befüllen.
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, TextursizeBig, TextursizeBig, GL_RGBA, GL_UNSIGNED_BYTE, @TexturBig);
Ein Auschnitt der Textur wird zur Laufzeit abwechslungsweise ausgtauscht
procedure TForm1.Timer1Timer(Sender: TObject);
const
step: GLfloat = 0.01;
z: integer = 1;
begin
if z > 10 then begin
glTexSubImage2D(GL_TEXTURE_2D, 0, 64, 64, TextursizeSmall, TextursizeSmall, GL_RGBA, GL_UNSIGNED_BYTE, @TexturSmall0);
end else begin
glTexSubImage2D(GL_TEXTURE_2D, 0, 64, 64, TextursizeSmall, TextursizeSmall, GL_RGBA, GL_UNSIGNED_BYTE, @TexturSmall1);
end;
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;
}
Fragment-Shader:
#version 330
in vec2 UV0;
uniform sampler2D Sampler;
out vec4 FragColor;
void main()
{
FragColor = texture( Sampler, UV0 );
}
Autor: Mathias
Siehe auch
- Übersichtseite Lazarus - OpenGL 3.3 Tutorial