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

时间:2015-08-02 05:11:50

标签: 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来偏移每个其他顶点。

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

2 个答案:

答案 0 :(得分:2)

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

请注意,您不需要"模板quad"总共有4个顶点。您只需在概念上需要两个属性,一个用于起点,一个用于终点。 (如果你在2D中工作,当然可以将其融合为一个vec4。在每个顶点着色器调用中,您将可以访问这两个点,并可以根据该值和gl_VertexID的值(仅在0到3范围内)构造最终顶点位置。这样,你可以完全摆脱你所针对的每个线段的两个点的顶点数组布局,并且仍然只需要一个绘制调用和一个顶点着色器。

答案 1 :(得分:1)

不,这是不可能的,因为每个顶点只处理一次。因此,如果您使用索引缓冲区引用顶点10次,则相应的顶点着色器仍然只执行一次。

这是使用Post Transform Cache在硬件中实现的。

  

在绝对最佳的情况下,您永远不必处理相同的顶点   不止一次。

     

顶点是否与前一个顶点相同的测试是   有些间接的。测试所有这些都是不切实际的   用户定义的不等式属性。相反,一种不同的手段   使用。

     

两个顶点被认为是相等的(在单个渲染命令中)   如果顶点的索引和实例计数相同(gl_VertexID   和着色器中的gl_InstanceID)。由于顶点为非索引   渲染总是在增加,不可能使用帖子   使用非索引渲染转换缓存。

     

如果顶点位于后变换缓存中,则该顶点数据为   甚至不一定再次从输入顶点数组读取。该   进程跳过读取和顶点着色器执行步骤,简单地说   将该顶点变换后数据的另一个副本添加到输出中   流。

为了解决您的问题,我将使用带有线(或线条)的几何着色器作为输入,并使用三角形条作为输出。使用此设置,您可以摆脱索引缓冲区,因为它只能在线路上工作。