在两个不同的顶点数组对象中使用顶点缓冲区

Posted

技术标签:

【中文标题】在两个不同的顶点数组对象中使用顶点缓冲区【英文标题】:Using a Vertex Buffer in two different Vertex Array Objects 【发布时间】:2014-05-08 12:54:46 【问题描述】:

这是一个理论问题,所以我到现在都没有代码。

假设我有一个带有顶点位置数据的 VBO,并在 VAO 中使用它来渲染具有特殊索引数组的三角形的索引 (glDrawElements()) 图。

现在我想在第二个 VAO 中重用这个数据缓冲区来渲染一些由线条组成的其他图形,但使用不同的索引数组。

我需要如何绑定缓冲区,以便我可以重用第一个 VAO 的顶点数据?

【问题讨论】:

我知道为什么,但对我来说,创建多个元素数组并更改它们比多个 vao 更有意义。 在我看来它更加模块化,但我会再考虑一下。谢谢。 【参考方案1】:

无需特殊代码即可在 VAO 之间共享缓冲区,只需像往常一样绑定它们即可。

设置:

glBindVertexArray(VAO[0]);
glBindBuffer(GL_ARRAY_BUFFER, locBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, triangleBuffer);
glVertexAttrPointer(...);

glBindVertexArray(VAO[1]);
glBindBuffer(GL_ARRAY_BUFFER, locBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, lineBuffer);
glVertexAttrPointer(...);

以及绘制时:

glBindVertexArray(VAO[0]);
glDrawElements(...);

glBindVertexArray(VAO[1]);
glDrawElements(...);

【讨论】:

为了进一步简化它,您也可以在设置中绑定 ELEMENT_ARRAY_BUFFER。该绑定是 VAO 状态的一部分。那么你只需要在绘图前调用glBindVertexArray() @RetoKoradi 对此不确定,文档对此很模糊。 我认为它现在正在运行。我会进一步测试并通知你。谢谢。 @ratchetfreak:没有广泛记录。一个决定性的数据点是 OpenGL 3.3 规范中的表 6.5。该表标记为“顶点数组对象状态”,并包含ELEMENT_ARRAY_BUFFER_BINDING。这与表 6.6 形成对比,表 6.6 标记为“顶点数组数据(不在顶点数组对象中)”,其中包含ARRAY_BUFFER_BINDING

以上是关于在两个不同的顶点数组对象中使用顶点缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL顶点数组对象不记录VBO和IBO绑定

我的OpenGL学习进阶之旅介绍顶点缓冲区对象VBO和元素数组缓冲区对象EBO,并对比使用VBO和不使用VBO绘制三角形的效果

顶点数组对象是上下文的一部分吗?

OpenGL复制顶点缓冲区对象

OpenGL 顶点数组对象是存储顶点缓冲区名称和索引,还是只存储索引?

绑定到“顶点数组对象”后,我应该删除“顶点缓冲区对象”吗?