Lazarus - OpenGL 3.3 Tutorial - 3D - Polygon - Seite (Backface Culling)

Aus DGL Wiki
Version vom 20. Dezember 2017, 17:42 Uhr von Mathias (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „200px<br><br> =3D - Polygon - Seite (Backface Culling) = == Einleitung ==…“)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Lazarus - OpenGL 3.3 Tutorial - 3D - Polygon - Seite (Backface Culling).png

3D - Polygon - Seite (Backface Culling)

Einleitung

Die Meshes ist hier noch 2D, aber Backface Culling wird in folgenden 3D-Beispielen gebraucht.

Defaultmässig zeichnet OpenGL immer die Vorder und Rückseite eines Polygones. Für die meisten Meshes ist dies aber nicht nötig.
Bei einem Würfel ist es nicht nötig, das die Innenseite der Polygone gezeichnet werden, da man diese sowieso nicht sieht.
Dies spart Rechneleistung, weil jede Pixelüberprüfung Zeit kostet.
Mit glEnable(GL_CULL_FACE); wird nur die Vorderseite der Polygone gezeichnet. Ausgenommen man schaltet es mit glCullFace(... um, so das nur die Rückseite gezeichnet wird.

In diesem Beispiel, wird dies mit einem Timer demonstriert.

Was dabei wichtig ist, die Polygone müssen immer im Gegenuhrzeigersinn gerendert werden. Auch dies könnte man glFrontFace(... umstellen.
Dafür gibt es die Parameter GL_CW für Uhrzeigersinn, und den Default-Parameter GL_CCW.


Wen man die Konstanten genau anschaut, sieht man, das das Dreieck im Gegenuhrzegersinn und das Qaudrat im Uhrzeigersinn deklariert ist.

const
  // Dreieck
  Triangle: array[0..0] of TFace =
    (((-0.4, 0.1, 0.0), (0.4, 0.1, 0.0), (0.0, 0.7, 0.0)));

  // Quadrat
  Quad: array[0..1] of TFace =
    (((-0.2, -0.6, 0.0), (-0.2, -0.1, 0.0), (0.2, -0.1, 0.0)),
    ((-0.2, -0.6, 0.0), (0.2, -0.1, 0.0), (0.2, -0.6, 0.0)));

Hier wird die Backface Culling

procedure TForm1.InitScene;
begin
  glEnable(GL_CULL_FACE);           // Überprüfung einschalten

Hier wird zwischen der Rück und Vorder-Seite umgesschalten.
Man sagt immer, welche Seite nicht gezeichnet wird.

procedure TForm1.Timer1Timer(Sender: TObject);
const
  CullFace: boolean = False;
begin
  if CullFace then begin
    glCullFace(GL_BACK);      // Rückseite nicht zeichnen.
  end else begin
    glCullFace(GL_FRONT);     // Vorderseite nicht zeichnen.
  end;
  CullFace := not CullFace;
  ogc.Invalidate;
end;



Vertex-Shader:


#version 330

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

void main(void)
{
  gl_Position = vec4(inPos, 1.0);
}



Fragment-Shader:

#version 330

out vec4 outColor;   // ausgegebene Farbe

void main(void)
{
  vec3 col = vec3(1.0, 0.0, 0.0);
  outColor = vec4(col, 1.0);
}


Autor: Mathias

Siehe auch