OpenGL Clip Planes
← GL Backface Beispiel | ● | Modellierungs-Sichtweisen →
Ebenengleichung der Clip-Ebene:
Berechnung der Distanz eines Punktes (x, y, z, w) von einer Ebene (a, b, c, d) mittels Skalarprodukt:
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
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:
Diese Clip Planes werden vom Framework nun mit Hilfe von Shadern realisiert:
#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?