Computergrafik

OpenGL Clip Planes

GL Backface Beispiel | | GL Tesselierung

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
GLdouble equ[4] = {a,b,c,d};

glClipPlane(GL_CLIP_PLANE0+n,equ);
glEnable(GL_CLIP_PLANE0+n);

Die obige Variante ist seit OpenGL 3.0 deprecated und wurde ab OpenGL 3.1 entfernt. Clip Planes werden nun zum Beispiel in Shadern implementiert:

//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


GL Backface Beispiel | | GL Tesselierung

Options: