90 - Versuche
02 - MipMap
procedure TForm1.CreateScene;
begin
Shader := TShader.Create([FileToStr('Vertexshader.glsl'), FileToStr('Fragmentshader.glsl')]);
with Shader do begin
UseProgram;
Matrix_ID := UniformLocation('mat');
glUniform1i(UniformLocation('Sampler'), 0);
end;
RotMatrix := TMatrix.Create; // Die drei Konstruktoren
ScaleMatrix := TMatrix.Create;
ScaleMatrix.Scale(0.5);
prodMatrix := TMatrix.Create;
Texturen laden
procedure TForm1.InitScene;
const
maxLevel = 5;
var
tex: array of UInt32;
w, i, j: integer;
begin
// ------------ Texture laden --------------
glGenTextures(1, @textureID0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureID0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, maxLevel - 1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
for i := 1 to maxLevel do begin
w := (1 shl (maxLevel - i)) * 256 * 4;
// w := (1 shl i) * 256;
WriteLn(w);
SetLength(tex, w * w);
for j := 0 to Length(tex) - 1 do begin
// tex[j] := $FF shl (4 * i) + (j mod 255);
//case i of
//1: tex[j] := $000FF;
//2: tex[j] := $00FF0;
//3: tex[j] := $0FF00;
//4: tex[j] := $FF000;
//end;
tex[j] := $FF00000 shr (i * 4);
end;
// WriteLn(IntToHex($FF00000 shr (i * 4), 8));
glTexImage2D(GL_TEXTURE_2D, i - 1, GL_RGBA, w, w, 0, GL_RGBA, GL_UNSIGNED_BYTE, Pointer(tex));
end;
glBindTexture(GL_TEXTURE_2D, 0);
glClearColor(0.6, 0.6, 0.4, 1.0); // Hintergrundfarbe
// Daten für Dreieck
glBindVertexArray(VBTriangle.VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBTriangle.VBOVertex);
glBufferData(GL_ARRAY_BUFFER, sizeof(Quad), @Quad, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, False, 0, nil);
glBindBuffer(GL_ARRAY_BUFFER, VBTriangle.VBOTex);
glBufferData(GL_ARRAY_BUFFER, sizeof(TextureVertex), @TextureVertex, GL_STATIC_DRAW);
glEnableVertexAttribArray(10);
glVertexAttribPointer(10, 2, GL_FLOAT, False, 0, nil);
end;
procedure TForm1.ogcDrawScene(Sender: TObject);
begin
glClear(GL_COLOR_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, textureID0);
Vertex-Shader:
Hier ist die Uniform-Variable mat hinzugekommen.
Diese wird im Vertex-Shader deklariert, Bewegungen kommen immer in diesen 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, -5 );
// FragColor = vec4(1.0);
}