非索引渲染中的gl_VertexID

时间:2019-02-21 12:59:34

标签: opengl opengl-4

OpenGL gl_VertexID页面明确指出:

  

gl_VertexID是一个顶点语言输入变量,其中包含该顶点的整数索引

而OpenGL Vertex Shader页面表示是

  

当前正在处理的顶点的索引。使用非索引渲染时,它是当前顶点的有效索引(已处理的顶点数+第一个值)。

我可以假定100%在非索引渲染命令中gl_VertexID是绑定顶点缓冲区中的int顶点索引吗?还是渲染命令正在处理的顶点索引(可能或可能不遵循顶点缓冲区中的顺序)

疑问来自()中的描述部分,因为已处理的顶点数等于顶点缓冲区中当前顶点的索引,必须对顶点进行线性处理。我是否可以总是这样?也许有一些OpenGL实现可以向后处理顶点,或在存储桶中等。

1 个答案:

答案 0 :(得分:4)

tl; dr:是的,gl_VertexID始终将是绘制调用指定的图元序列中各个顶点的逻辑索引(有效地是从顶点缓冲区中顶点数据的位置开始的索引被阅读)。它不依赖于顶点实际处理的方式或顺序(如果这样做的话,这将使其成为相当无用的功能,因为它将不会提供任何可靠的行为)。

来自OpenGL 4.6 specification(11.1.3.9着色器输入):

  

gl_VertexID保留由 DrawArrays 隐式传递的整数索引 i 或   第10.4节中定义的其他绘图命令之一。

以及从10.4开始:

  

DrawArraysOneInstance 传输到GL的任何元素的索引   被称为其 vertex ID ,并且可由顶点着色器读取为gl_VertexID。传输的第 i 个元素的 vertex ID first + i

  

DrawElementsOneInstance 传输到GL的任何元素的索引   被称为其 vertex ID ,并且可由顶点着色器读取为   gl_VertexID。传输的第 i 个元素的 vertex ID 是    basevertex 以及存储在当前绑定元素数组缓冲区中的偏移量 indices + i 处的值。

现在,所有非索引绘制调用的行为都是根据抽象DrawArraysOneInstance命令指定的。并且所有索引的绘制调用的行为都是根据抽象DrawElementsOneInstance命令指定的。无需赘述(您可以在10.4节中进行挖掘。如果要了解更多信息),以上所有内容基本上意味着,如果使用索引缓冲区进行绘制,则gl_VertexID将成为由索引缓冲区指定的顶点索引,如果您在没有索引缓冲区的情况下进行绘制,那么gl_VertexID将成为原始序列给定的顶点索引…