非索引呈现中的gl_VertexID

问题描述 投票:5回答:1

OpenGL gl_VertexID页面明确指出:

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

虽然OpenGL Vertex Shader页面说的是

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

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

怀疑来自描述部分inside(),至于处理顶点的数量等于顶点缓冲区中当前顶点的索引,顶点必须线性处理。我可以假设情况永远如此吗?或者也许有OpenGL实现可以向后处理顶点,或者在存储桶等中处理顶点。

opengl opengl-4
1个回答
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是第一个+ i。

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

现在,所有非索引绘制调用的行为都是根据抽象DrawArraysOneInstance命令指定的。并且所有索引绘制调用的行为都是根据抽象DrawElementsOneInstance命令指定的。没有进一步细节(你可以在第10.4节中挖掘。如果你想了解更多),以上所有基本上意味着如果你用索引缓冲区绘制,那么gl_VertexID将成为顶点的索引由索引缓冲区指定,如果你绘制没有索引缓冲区,那么gl_VertexID将成为原始序列给出的顶点的索引...

© www.soinside.com 2019 - 2024. All rights reserved.