非索引渲染中的gl_VertexID

8

OpenGL gl_VertexID页面明确说明:

gl_VertexID是一个顶点语言输入变量,它保存顶点的整数索引。

而OpenGL Vertex Shader页面说它是:

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

我可以百分之百地假设,在非索引渲染命令中,gl_VertexID是绑定顶点缓冲区中的int顶点索引吗?还是它是正在被渲染命令处理的顶点的索引(可能或可能不按照顶点缓冲区中的顺序)?

疑问来自()内的描述部分,对于要使已处理顶点数等于顶点缓冲区中当前顶点的索引,必须线性处理顶点。我可以假设这总是成立的吗?或者可能存在OpenGL实现会反向处理顶点,或按桶处理等情况吗?
1个回答

6
简述:是的,gl_VertexID始终是您绘制调用中指定的原始序列中相应顶点的逻辑索引(实际上是从顶点缓冲区中读取顶点数据的位置索引)。它不依赖于实际处理顶点的方式或顺序(如果依赖的话,那么它将是一个相当无用的特性,因为它将提供没有可靠行为的功能)。

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

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

以及来自10.4:

通过 DrawArraysOneInstance 传输到 GL 的任何元素的索引都被称为其 顶点 ID,可以由顶点着色器读取为 gl_VertexID。传输的第 i 个元素的 顶点 IDfirst + i

通过 DrawElementsOneInstance 传输到 GL 的任何元素的索引都被称为其 顶点 ID,可以由顶点着色器读取为 gl_VertexID。传输的第 i 个元素的 顶点 IDbasevertex 和当前绑定的元素数组缓冲区中偏移量为 indices + i 的值之和。

现在,所有未索引的绘制调用的行为都是以抽象的DrawArraysOneInstance命令来指定的。而所有索引绘制调用的行为都是以抽象的DrawElementsOneInstance命令来指定的。不再深入讨论(如果您想了解更多信息,可以查看第10.4节),以上所有基本上意味着,如果使用索引缓冲区进行绘制,则gl_VertexID将是由索引缓冲区指定的顶点的索引;如果没有使用索引缓冲区进行绘制,则gl_VertexID将是由原始序列给出的顶点的索引...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接