gl_ClipVertex如何相对于gl_ClipDistance工作?

whi*_*der 3 opengl 3d clipping vertex-shader

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

gl_ClipVertexgl_ClipDistance我的前身,但我找不到有关它是如何工作的信息,特别是相对于gl_ClipDistance它是如何使用的信息.

我的目标是剪切剪裁平面的交叉点 而不需要多个渲染过程.在上面引用的问题中,有人建议我使用gl_ClipDistance.像这样的例子对我来说很清楚,但我不知道如何应用它gl_ClipVertex.

我怎样才能gl_ClipVertex用于同一目的?

And*_*man 9

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

事实上,如果你看这里:

OpenGL®着色语言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
Run Code Online (Sandbox Code Playgroud)

您会注意到这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之间逐渐引入