Das Array gl_ClipDistance
enthält eine Reihe von Fließkommawerten, die für jeden Eckpunkt die Seite einer konzeptionellen "Ebene" darstellen. Jeder Array-Index ist eine konzeptionelle "Ebene". Der Scheitelpunkt kann entweder auf der negativen Seite oder der nicht negativen Seite liegen.
Wenn zwei Scheitelpunkte der gleichen Linie/des Dreiecks auf zwei verschiedenen Seiten der Ebene liegen (dh ein Scheitelpunkt hat einen negativen und der andere einen nicht negativen), wird das Primitiv an der Stelle abgeschnitten wo dieser Abstand 0 ist. Der Teil des Primitivs auf der nicht-negativen Seite wird sichtbar sein.
Gegeben, was Sie tun müssen, ist einen Clip-Abstand Wert, der den Abstand zwischen der Ecke Position und der Ebene, die Sie gegen Clip ausrichten soll. Die Standardebenengleichung (Ax + By + Cz + D = 0) gibt uns eine Möglichkeit, damit umzugehen. Der Abstand eines Punktes von der Ebene A, B, C, D, unter der Annahme, die den Vektor (A, B, C) ein Einheitsvektor ist, ist einfach:
dot(point, vec3(A, B, C)) + D
Dies setzt auch voraus, dass point
in derselben ist Raum als A, B, C und D.
natürlich, wenn point
ein vec4
ist, mit der letzten Komponente als 1,0 ist, dann können Sie dies nur tun:
dot(point, plane);
Wo plane
ein vec4
ist, dass enthält A, B, C und D. Und das ist Ihre Clipentfernung.
Sie müssen auch gl_ClipDistance
mit einer expliziten Größe in der Shader-Stufe, die es verwendet, redeclare. In GLSL 3.20+, gl_ClipDistance
lebt in einem Interface-Block, so müssen Sie das redeclare:
out gl_PerVertex
{
vec4 gl_Position;
float gl_ClipDistance[1];
};