gl_ClipVertex如何相对于gl_ClipDistance工作?

时间:2013-10-01 20:48:24

标签: opengl 3d clipping vertex-shader

我计划在我的顶点着色器中使用gl_ClipDistance,直到我意识到我的项目是OpenGL 2.1 / GLSL 1.2,这意味着gl_ClipDistance不可用。

gl_ClipVertexgl_ClipDistance的前身,但我找不到有关其工作原理的信息,特别是与gl_ClipDistance相关的信息,如何使用。

我的目标是clip the intersection of clipping planes ,无需需要多次渲染过程。在上面引用的问题中,有人建议我使用gl_ClipDistance。像this one这样的示例对我来说很清楚,但我不知道如何将其应用到gl_ClipVertex

如何将gl_ClipVertex用于同一目的?

1 个答案:

答案 0 :(得分:9)

如有疑问,您应该始终检查正式的GLSL规范。特别是,由于这个预先声明的变量是在GLSL 1.3中引入的,因此您知道(或应该假设)将讨论旧技术的弃用和新技术的实现。

事实上,如果你看看这里:

The OpenGL® Shading Language 1.3 - 7.1顶点着色器特殊变量 - 第60-61页

  

不推荐使用变量gl_ClipVertex。它仅在顶点语言中可用,并为顶点着色器提供了一个位置,用于写入要与用户剪切平面一起使用的坐标。用户必须确保在同一坐标空间中定义剪辑顶点和用户剪裁平面。用户剪辑平面仅在线性变换下正常工作。未定义在非线性变换下会发生什么。

对两者使用的实际类型的进一步调查也应该给出两者之间差异的主要暗示:

out float gl_ClipDistance[]; // may be written to
out vec4  gl_ClipVertex;     // may be written to, deprecated

你会注意到gl_ClipVertex是一个完整的位置(4分量)向量,其中gl_ClipDistance[]只是一个浮点数的数组。您可能没有注意到的是gl_ClipDistance[]是几何着色器的输入/输出和片段着色器的输入,其中gl_ClipVertex仅存在于顶点着色器中。

剪辑顶点是用于剪裁的位置,其中剪辑距离是每个剪裁平面的距离(您可以自己计算)。对于每个剪切平面任意指定距离的能力允许如上所述的非线性变换,在此之前,您可以做的就是设置用于计算每个剪切平面的距离的位置。

全面展望:

从剪辑顶点计算剪切,用作顶点变换和片段着色之间的固定功能管道的一部分。当引入GLSL 1.3时,Shader Model 4.0已经由DX10正式定义了多年,它暴露了可编程原始组件和逻辑上更灵活的裁剪计算。我们在GLSL 1.5之前没有获得几何着色器,但Shader Model 4.0的许多其他部分在1.3和1.5之间逐渐引入