gl_ClipVertex相对于gl_ClipDistance是如何工作的?

3
我原本计划在我的顶点着色器中使用gl_ClipDistance,但后来意识到我的项目是OpenGL 2.1 / GLSL 1.2,这意味着gl_ClipDistance不可用。 gl_ClipVertexgl_ClipDistance的前身,但关于它的工作原理以及与gl_ClipDistance相比如何使用的信息非常少。
我的目标是裁剪裁剪平面的交点,而无需进行多次渲染。 在上面提到的问题中,建议我使用gl_ClipDistance。 像这个这样的示例对我来说很清楚,但我不知道如何将其应用于gl_ClipVertex

我该如何使用gl_ClipVertex来达到相同的目的?

1个回答

9

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

实际上,如果您在此处查看,就会发现:

OpenGL® Shading Language 1.3 - 7.1 顶点着色器特殊变量 - pp. 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才获得几何着色器,但在1.3和1.5之间逐渐引入了Shader Model 4.0的许多其他部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接