Hap*_*lue 2 opengl glsl clip vertex-shader
我正在尝试在我的 OpenGL 项目中渲染正确的折射/反射,我需要使用剪辑距离。我正在关注Thin Matrix的教程。
我启用剪辑距离
glEnable(GL_CLIP_DISTANCE0);
Run Code Online (Sandbox Code Playgroud)
在我的游戏循环中,然后我尝试在这样的顶点着色器中使用它
gl_ClipDistance[0] = -1;
Run Code Online (Sandbox Code Playgroud)
我试图改变 -1 值,但无论我做什么都没有任何反应。我还需要做些什么才能正确启用它吗?
该gl_ClipDistance数组包含一系列浮点值,代表每个顶点在概念“平面”的哪一侧。每个数组索引都是一个概念上的“平面”。顶点可以在负侧,也可以在非负侧。
如果同一直线/三角形的两个顶点位于平面的两个不同边上(即一个顶点为负值,另一个为非负值),则图元将在距离为0. 非负侧的基元部分将是可见的。
鉴于此,您需要做的是设置一个裁剪距离值,该值表示顶点位置与您要裁剪的平面之间的距离。标准平面方程 (Ax + By + Cz + D = 0) 为我们提供了一种处理方法。假设向量 (A, B, C) 是单位向量,则点到平面 A、B、C、D 的距离为:
dot(point, vec3(A, B, C)) + D
Run Code Online (Sandbox Code Playgroud)
这也假设它point与 A、B、C 和 D 位于相同的空间中。
当然,如果point是 a vec4,最后一个组件为 1.0,那么你可以这样做:
dot(point, plane);
Run Code Online (Sandbox Code Playgroud)
包含 A、B、C 和 D 的planea在哪里vec4。这就是您的剪辑距离。
您还需要gl_ClipDistance在使用它的着色器阶段使用明确的大小重新声明。在 GLSL 3.20+ 中,gl_ClipDistance位于接口块内,因此您必须重新声明:
out gl_PerVertex
{
vec4 gl_Position;
float gl_ClipDistance[1];
};
Run Code Online (Sandbox Code Playgroud)