gl_VertexID在非索引渲染中



OpenGL gl_VertexID页面明确指出:

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

而OpenGL顶点着色器页面说它是

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

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

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

tl;DR:是的,gl_VertexID始终是绘制调用指定的基元序列中相应顶点的逻辑索引(实际上是顶点缓冲区中读取顶点数据的索引)。它不依赖于实际处理顶点的方式或顺序(如果是这样,这将使它成为一个相当无用的功能,因为它不会提供任何可靠的行为)。

根据 OpenGL 4.6 规范(11.1.3.9 着色器输入):

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

从 10.4 开始:

任何由DrawArraysOneInstance转移到GL的元素的索引被称为它的vertex ID,并且可以被顶点着色器读取为gl_VertexID。转移的第 i 个元素的vertex IDfirst + i

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

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

相关内容

  • 没有找到相关文章

最新更新