Lazarus - OpenGL 3.3 Tutorial - 3D - Tiefenbuffer: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
(Die Seite wurde neu angelegt: „200px<br><br> =3D - Tiefenbuffer = == Einleitung == Einen Tiefenbuffer braucht man, das Polygon…“)
 
(Einleitung)
Zeile 20: Zeile 20:
 
Jetzt darf der kleine Würfel nicht mehr sichtbar sein, da sich dieser hinter dem grossen versteckt.<br>
 
Jetzt darf der kleine Würfel nicht mehr sichtbar sein, da sich dieser hinter dem grossen versteckt.<br>
 
<syntaxhighlight lang="pascal">procedure TForm1.ogcDrawScene(Sender: TObject);
 
<syntaxhighlight lang="pascal">procedure TForm1.ogcDrawScene(Sender: TObject);
 +
var
 +
  TempMatrix: TMatrix;
 
begin
 
begin
 
   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);  // Frame und Tiefen-Buffer löschen.
 
   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);  // Frame und Tiefen-Buffer löschen.
 
  //  glEnable(GL_CULL_FACE);
 
  //  glCullface(GL_BACK);
 
  
 
   Shader.UseProgram;
 
   Shader.UseProgram;
Zeile 35: Zeile 34:
 
   glDrawArrays(GL_TRIANGLES, 0, Length(CubeVertex) * 3);
 
   glDrawArrays(GL_TRIANGLES, 0, Length(CubeVertex) * 3);
  
   WorldMatrix.Push;
+
   TempMatrix := WorldMatrix;
  
 
   WorldMatrix.Scale(0.5);
 
   WorldMatrix.Scale(0.5);
Zeile 41: Zeile 40:
 
   glDrawArrays(GL_TRIANGLES, 0, Length(CubeVertex) * 3); // wird nicht gezeichnet.
 
   glDrawArrays(GL_TRIANGLES, 0, Length(CubeVertex) * 3); // wird nicht gezeichnet.
  
   WorldMatrix.Pop;
+
   WorldMatrix := TempMatrix;
  
 
   ogc.SwapBuffers;
 
   ogc.SwapBuffers;
 
end;</syntaxhighlight>
 
end;</syntaxhighlight>
 
<br><br>
 
<br><br>
 +
 
==Vertex-Shader:==
 
==Vertex-Shader:==
 
<syntaxhighlight lang="glsl">#version 330
 
<syntaxhighlight lang="glsl">#version 330

Version vom 23. März 2018, 21:37 Uhr

Lazarus - OpenGL 3.3 Tutorial - 3D - Tiefenbuffer.png

3D - Tiefenbuffer

Einleitung

Einen Tiefenbuffer braucht man, das Polygone nicht einfach willkürlich übereinander gezeichnet werden.
Mit dem Tiefenbuffer wird berechnet, das ein Polygon das sich hinter einem anderen befindet, nicht gezeichnet wird.
Diese Berechnung läuft auf Pixelebene.

Bei dem Würfelbeispiel, wird der kleine Würfel nicht mehr gezeichnet, da sich dieser hinter den Flächen des grossen Würfels befindet.


Hier wird den Tiefenbufferprüfung eingeschaltet, dies geschieht mit glEnable(GL_DEPTH_TEST);.
Die Art der Prüfung kann man mit glDepthFunc(... einstellen, wobei defaut auf GL_LESS ist.
Mit GL_LESS wird geprüft, ob der Z-Wert geringer ist, und wen ja, darf der Pixel gezeichnet werden.

procedure TForm1.CreateScene;
begin
  glEnable(GL_DEPTH_TEST);  // Tiefenprüfung einschalten.
  glDepthFunc(GL_LESS);     // Kann man weglassen, da default.

Bei glClear(... ist noch etwas neues dazugekommen, GL_DEPTH_BUFFER_BIT.
Dies bewirkt, das bei glClear(... nicht nur der Frame-Buffer gelöscht wird, sondern aud der Tiefenbuffer.
Jetzt darf der kleine Würfel nicht mehr sichtbar sein, da sich dieser hinter dem grossen versteckt.

procedure TForm1.ogcDrawScene(Sender: TObject);
var
  TempMatrix: TMatrix;
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);  // Frame und Tiefen-Buffer löschen.

  Shader.UseProgram;

  // --- Zeichne Würfel

  glBindVertexArray(VBCube.VAO);

  WorldMatrix.Uniform(WorldMatrix_ID);
  glDrawArrays(GL_TRIANGLES, 0, Length(CubeVertex) * 3);

  TempMatrix := WorldMatrix;

  WorldMatrix.Scale(0.5);
  WorldMatrix.Uniform(WorldMatrix_ID);
  glDrawArrays(GL_TRIANGLES, 0, Length(CubeVertex) * 3); // wird nicht gezeichnet.

  WorldMatrix := TempMatrix;

  ogc.SwapBuffers;
end;



Vertex-Shader:

#version 330

layout (location = 10) in vec3 inPos; // Vertex-Koordinaten
layout (location = 11) in vec3 inCol; // Farbe

out vec4 Color;                       // Farbe, an Fragment-Shader übergeben

uniform mat4 Matrix;                  // Matrix für die Drehbewegung

void main(void)
{
  gl_Position = Matrix * vec4(inPos, 1.0);
  Color = vec4(inCol, 1.0);
}



Fragment-Shader

#version 330

in vec4 Color;      // interpolierte Farbe vom Vertexshader
out vec4 outColor;  // ausgegebene Farbe

void main(void)
{
  outColor = Color; // Die Ausgabe der Farbe
}


Autor: Mathias

Siehe auch