OpenGL gl_VertexID页面明确指出:
gl_VertexID是一个顶点语言输入变量,它包含顶点的整数索引
虽然OpenGL Vertex Shader页面说的是
当前正在处理的顶点的索引。使用非索引渲染时,它是当前顶点的有效索引(处理的顶点数+第一个值)。
我可以假设100%在非索引渲染命令中gl_VertexID是绑定顶点缓冲区中的int顶点索引吗?或者它是由渲染命令处理的顶点的索引(可能或可能不遵循顶点缓冲区中的顺序)
怀疑来自描述部分inside(),至于处理顶点的数量等于顶点缓冲区中当前顶点的索引,顶点必须线性处理。我可以假设情况永远如此吗?或者也许有OpenGL实现可以向后处理顶点,或者在存储桶等中处理顶点。
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
是第一个+ i。
和
由DrawElementsOneInstance传递给GL的任何元素的索引称为其
vertex ID
,并且可以由顶点着色器读取为gl_VertexID
。传递的第i个元素的vertex ID
是basevertex和存储在偏移索引+ i的当前绑定元素数组缓冲区中的值之和。
现在,所有非索引绘制调用的行为都是根据抽象DrawArraysOneInstance
命令指定的。并且所有索引绘制调用的行为都是根据抽象DrawElementsOneInstance
命令指定的。没有进一步细节(你可以在第10.4节中挖掘。如果你想了解更多),以上所有基本上意味着如果你用索引缓冲区绘制,那么gl_VertexID
将成为顶点的索引由索引缓冲区指定,如果你绘制没有索引缓冲区,那么gl_VertexID
将成为原始序列给出的顶点的索引...