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

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

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

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

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

【问题讨论】:

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

标签: c++ opengl glsl


【解决方案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
猜你喜欢
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多