opengl - gl_ClipVertex 相对于 gl_ClipDistance 如何工作?

标签 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 无需需要多个渲染 channel 。在上面引用的问题中,建议我使用gl_ClipDistance。例如 this one我很清楚,但我不知道如何将其应用到 gl_ClipVertex

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

最佳答案

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

事实上,如果你看这里:

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

The variable gl_ClipVertex is deprecated. It is available only in the vertex language and provides a place for vertex shaders to write the coordinate to be used with the user clipping planes. The user must ensure the clip vertex and user clipping planes are defined in the same coordinate space. User clip planes work properly only under linear transform. It is undefined what happens under non-linear transform.

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

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

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

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

要正确看待这一切:

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

关于opengl - gl_ClipVertex 相对于 gl_ClipDistance 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19125628/

相关文章:

java - 如何解决 OpenGL 中的 z-fighting 问题?

OpenGL 2D非矩形区域裁剪

java - LWJGL:glTexImage2D 实现

javascript - 3D 模型同比例,三个 JS

algorithm - Liang-Barsky 剪线算法

3d - 如何从 Google 地球导出整个城市的 3D 模型

matlab - 在 MATLAB 中绘制 3-D 矩阵*值*

flash - 简单的OpenGL实现

c++ - Qt 顶点数组不适用于 QImage

delphi - 有 Delphi 的游戏引擎吗?