2017-08-12 5 views
1

Ich versuche, eine richtige Refraktion/Reflexion in meinem OpenGL-Projekt zu machen, und ich brauche Clipdistanz. Ich folge dem Tutorial von Thin Matrix.OpenGL Enable Clip Distance

ermogliche den Clip Abstand mit

glEnable(GL_CLIP_DISTANCE0); 

in meinem Spiel Schleife und dann versuche ich es in dem Vertex-Shader zu verwenden, wie dies

gl_ClipDistance[0] = -1; 

Ich habe versucht, um das zu ändern - 1 Wert, aber nichts passiert, egal was ich mache. Gibt es noch etwas, das ich tun muss, um es richtig zu aktivieren?

Antwort

4

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]; 
};