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

Pet*_*oip 5 opengl vertex-shader

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

现在我可以在以下地方工作:

顶点缓冲区:{v0, v1, v2, v3}

索引缓冲区(三角带):{0, 1, 2, 3}

在此输入图像描述

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

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

顶点缓冲区:{v0, v2}

索引缓冲区(三角带):{0, 0, 1, 1}

并使用虚数gl_ElementID % 2来偏移所有其他顶点。

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

der*_*ass 3

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

请注意,您根本不需要具有 4 个顶点的“模板四边形”。从概念上讲,您只需要两个属性,一个用于起点,一个用于终点。vec4(如果您使用 2D 工作,当然可以将其融合为 1D )。在每次顶点着色器调用中,您都可以访问这两个点,并可以根据该点和 的值gl_VertexID(仅在 0 到 3 的范围内)构造最终顶点位置。这样,您就可以精确地实现您想要的每条线段两个点的顶点数组布局,并且仍然只需要一个绘制调用和一个顶点着色器。