opengl - 在 OpenGL 的顶点着色器中获取元素 ID

标签 opengl vertex-shader

我正在渲染一条由 OpenGL 中的三角形组成的线。

现在我让它在以下位置工作:

顶点缓冲区:{v0, v1, v2, v3}
索引缓冲区(三角带):{0, 1, 2, 3}
enter image description here

顶部图像是传递到顶点着色器的原始数据,底部是将偏移应用于 v1 和 v3(使用顶点属性)后的顶点着色器输出。

我的目标是在线上的每个点使用一个顶点并以其他方式生成偏移量。我正在查看 gl_VertexID,但我想要更像元素 ID 的东西。这是我想要的设置:

顶点缓冲区:{v0, v2}
索引缓冲区(三角带):{0, 0, 1, 1}
并使用假想 gl_ElementID % 2偏移每个其他顶点。

我试图避免使用几何着色器或其他顶点属性。有没有办法做到这一点?我对完全不同的想法持开放态度。

最佳答案

我可以想到一种方法来避免几何着色器并仍然使用紧凑的表示:instanced rendering .只需绘制一个四边形的多个实例(作为三角形条),并通过 glVertexAttribDivisor() 将两个位置定义为每个实例的属性。 .

请注意,您根本不需要具有 4 个顶点的“模板四边形”。从概念上讲,您只需要两个属性,一个用于起点,另一个用于终点。 (当然,如果您在 2D 中工作,则可以将其融合为一个 vec4 )。在每个顶点着色器调用中,您都可以访问这两个点,并且可以基于该点和 gl_VertexID 的值构建最终顶点位置。 (这只会在 0 到 3 的范围内)。这样,您可以完全摆脱您所针对的每条线段的两个点的顶点阵列布局,并且仍然只需要一个绘制调用和一个顶点着色器。

关于opengl - 在 OpenGL 的顶点着色器中获取元素 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31768783/

相关文章:

c++ - 对 `_imp__glewInit@0' 的 undefined reference

glsl - WebGL:在没有 THREE.JS 帮助的情况下添加镜面光

c++ - 仅显示灰色的 OpenGL 反射着色器

c# - OpenGL - 单 channel 立方体贴图不产生输出

c++ - OpenGL 在给定的空间和相机中创建一个房间

opengl - GLSL、信号量?

opengl - 顶点和片段着色器如何在 OpenGL 中通信?

android - 如何提供着色器函数来执行视频的 alpha mask

android - 在 OpenGL 中将 alpha mask 应用于视频

opengl - 平滑渲染 1.2 GB 的纹理,1 GB 的 GPU 如何做到这一点?