3

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

gl_ClipVertex是它的前身,gl_ClipDistance但我几乎找不到关于它如何工作的信息,尤其是相对于gl_ClipDistance它的使用方式。

我的目标是在不需要多个渲染通道的情况下裁剪裁剪平面的交叉点。 在上面提到的问题中,有人建议我使用. 像这样的例子对我来说很清楚,但我不知道如何将它应用于.gl_ClipDistancegl_ClipVertex

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

4

1 回答 1

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

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

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

综观这一切:

从剪辑顶点进行剪辑的计算曾经作为顶点变换和片段着色之间的固定功能管道的一部分发生。当 GLSL 1.3 被引入时,DX10 已经正式定义了 Shader Model 4.0 多年,它公开了可编程基元组装和逻辑上更灵活的裁剪计算。我们直到 GLSL 1.5 才获得几何着色器,但 Shader Model 4.0 的许多其他部分在 1.3 和 1.5 之间逐渐引入

于 2013-10-01T22:43:04.297 回答