OpenGL gl_VertexID页面明确指出:
gl_VertexID是一个顶点语言输入变量,其中包含该顶点的整数索引
而OpenGL Vertex Shader页面表示是
当前正在处理的顶点的索引。使用非索引渲染时,它是当前顶点的有效索引(已处理的顶点数+第一个值)。
我可以假定100%在非索引渲染命令中gl_VertexID是绑定顶点缓冲区中的int顶点索引吗?还是渲染命令正在处理的顶点索引(可能或可能不遵循顶点缓冲区中的顺序)
疑问来自()中的描述部分,因为已处理的顶点数等于顶点缓冲区中当前顶点的索引,必须对顶点进行线性处理。我是否可以总是这样?也许有一些OpenGL实现可以向后处理顶点,或在存储桶中等。
答案 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
将成为原始序列给定的顶点索引…