首页 > 解决方案 > 是否可以在 OpenGL 的同一个调用中渲染两个具有不同索引起点的不同缓冲区?

问题描述

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

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

对象 2:

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

其中 vertices 是被推送到 的浮点向量,GL_ARRAY_BUFFERindices 是被推送到 的无符号向量GL_ELEMENT_ARRAY_BUFFER

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

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

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

这些对象可以有非常不同的大小,所以我认为固定偏移也不是一个可行的解决方案。

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

标签: c++opengl

解决方案


各种渲染命令baseVertex参数基本上是为了做你所要求的。该参数是一个整数,在从顶点缓冲区中获取任何顶点属性之前,它会被添加到渲染命令中的每个索引。BaseVertexbaseVertex

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

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

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


推荐阅读