90 - Versuche

08 - MipMap

Selfhtml



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;
  Matrix := TMatrix.Create;

  FrustumMatrix := TMatrix.Create;
  FrustumMatrix.Perspective(45, 1.0, 2.5, 1000.0); // Alternativ

  WorldMatrix := TMatrix.Create;
  WorldMatrix.Translate(0, 0, -200.0); // Die Scene in den sichtbaren Bereich verschieben.
  WorldMatrix.Scale(5.0);              // Und der Grösse anpassen.

  WorldMatrix.RotateA(1.5);  // Drehe um Y-Achse
  WorldMatrix.RotateC(pi);  // Drehe um Y-Achse
Texturen laden
procedure TForm1.InitScene;
begin
  // ------------ Texture laden --------------

  Textur[0] := TTexturBuffer.Create;
  with Textur[0] do begin
    IsMipMap := False;
    TexParameter.Add(GL_TEXTURE_MIN_FILTER, GL_NEAREST);


    LoadTextures('mauer.xpm');
  end;

  Textur[1] := TTexturBuffer.Create;
  with Textur[1] do begin
    TexParameter.Add( GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

    LoadTextures('mauer.xpm');
  end;

  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);
var
  x, y: integer;
const
  d = 2.0;
  s = 8;
begin
  Matrix := TMatrix.Create;
  glClear(GL_COLOR_BUFFER_BIT);

  Textur[0].ActiveAndBind();


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);
}



zurück