Computergrafik

OpenGL Clip Planes

GL Backface Beispiel | | Modellierungs-Sichtweisen

Ebenengleichung der Clip-Ebene:

$n\cdot(p-v)=0 \quad$$\quad ax+by+cz+d = 0$.

Berechnung der Distanz eines Punktes (x, y, z, w) von einer Ebene (a, b, c, d) mittels Skalarprodukt:

$ \text{clip_distance} = \begin{bmatrix}x, & y, & z, & w\end{bmatrix} \cdot \begin{bmatrix}a, & b, & c, & d\end{bmatrix} $.

Dadurch kann die Geometrie an der Ebene abgeschnitten werden, so dass nur die Hälfte des Raums gezeichnet wird, in welchen die Normale zeigt.

Bis OpenGL Version 3.0 wurden mindestens 6 Clipebenen durch die Grafikhardware unterstützt

→ Clipvolumen durch Definition eines Clipwürfels
int n=0; // first clip plane
GLdouble equ[4] = {a,b,c,d}; // plane equation

glClipPlane(GL_CLIP_PLANE0+n,equ); // set clip plane
glEnable(GL_CLIP_PLANE0+n); // enable clip plane

Die obige Variante ist seit OpenGL 3.0 deprecated und wurde ab OpenGL 3.1 entfernt.

Mit Hilfe des Frameworks sind Clip-Ebenen im Legacy-Style aber weiterhin verfügbar:

lglClipPlane(num, pos, normal);

Diese Clip Planes werden vom Framework nun mit Hilfe von Shadern realisiert:

//VERTEX SHADER
#version 120
attribute vec4 vertex_position;
uniform mat4 mvp;

vec4 plane = vec4(a, b, c, d);
varying float clipdist;

void main()
{
    gl_Position = mvp * vertex_position;
    clipdist = dot(plane, vertex_position);
}

//FRAGMENT SHADER
#version 120
uniform vec4 color;
varying float clipdist;

void main()
{
    vec4 col = clipdist * color;
    gl_FragColor = col;
    if(clipdist < 0)
    {
        discard;
    }
}

Das Ergebnis sieht dann wie folgt aus:


Implementierung von Clip Planes im Shader

Q Verständnisfragen:

  • In welchem Koordinatensystem wird geclippt?
  • Ist das im allgemeinen sinnvoll?
  • In welchem Koordinatensystem sollte anstelle dessen geclippt werden?


GL Backface Beispiel | | Modellierungs-Sichtweisen

Options: