是否可以在 OpenGL 中的同一调用中呈现两个具有不同索引起点的不同缓冲区?

Is it possible render two different buffers with different indices starting point in the same call in OpenGL?

本文关键字:两个 起点 缓冲区 索引 OpenGL 调用 是否      更新时间:2023-10-16

我有两个对象,定义如下: 对象 1:

vertices = {...}
indices = {1, 2, 3, 4, 5, ...} 

和对象 2:

vertices = {...}
indices = {1, 2, ...}

其中顶点是被推送到GL_ARRAY_BUFFER的浮点向量,索引是被推送到GL_ELEMENT_ARRAY_BUFFER的无符号向量。

这些对象没有需要应用于它们的转换,并且相对静态,但可以由用户修改。

我不想创建包含两个对象的所有顶点的单个对象,因为我希望对这些对象的修改尽可能快,因此对象越小,重建网格的速度就越快。我知道对两个小对象进行两次绘制调用比对单个对象进行一次绘制调用慢,即使对象稍大,因此我想将它们批处理在一起。

我的问题是我可以使用glBufferSubData从缓冲区中推送或删除顶点,但对于索引,我需要遍历第二个对象的每个值并将其偏移以考虑第一个对象的索引,因此它最终可能会变慢。

对象可以具有非常不同的大小,因此我认为固定偏移量也不是可行的解决方案。

是否可以告诉 OpenGL,第一个对象的索引引用到第一个对象的顶点,第二个对象的索引引用到第二个对象的顶点?在这种情况下,我将只能修改缓冲区对象的一部分,而无需每次都偏移每个对象的索引。

各种BaseVertex呈现命令的baseVertex参数基本上是为了执行您所要求的操作。baseVertex参数是一个整数,在从顶点缓冲区获取任何顶点属性之前,该整数将添加到呈现命令中的每个索引

假设这是您的索引缓冲区:

0 1 2 1 3 2 0 1 2 1 3 2
|  Mesh 0  |  Mesh 1  |

如果网格 0 有 4 个顶点,则将 4 作为glDrawElementsBaseVertexbaseVertex或类似命令传递。这有效地使网格 1 中的索引4 5 6 5 7 6