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

Posted

技术标签:

【中文标题】gl_ClipVertex 相对于 gl_ClipDistance 是如何工作的?【英文标题】:How does gl_ClipVertex work relative to gl_ClipDistance? 【发布时间】:2013-10-08 04:05:11 【问题描述】:

我计划在我的顶点着色器中使用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】:

如有疑问,您应该始终检查正式的 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 引入时,DX10 已经正式定义了 Shader Model 4.0 多年,它公开了可编程的基元组装和逻辑上更灵活的裁剪计算。我们直到 GLSL 1.5 才获得几何着色器,但 Shader Model 4.0 的许多其他部分在 1.3 和 1.5 之间逐渐引入

【讨论】:

以上是关于gl_ClipVertex 相对于 gl_ClipDistance 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

在 CSS 文件中使用相对 URL,它相对于啥位置?

Vscode的相对路径读取问题及处理

查找元素相对于文档的位置

元素竖向的百分比设定是相对于容器的高度吗?

require_once 在文件相对于根目录时不起作用,但在相对于当前位置时起作用

AndroidStudio相对布局