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
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:
#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 →