首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理VAO中存储的VAO

如何处理VAO中存储的VAO
EN

Stack Overflow用户
提问于 2014-08-06 18:29:44
回答 1查看 5.4K关注 0票数 5

我是OpenGL的新手,正在学习VBO和VAOs。我正在尝试理解如何在VAO中释放/释放/分离VBO,当我不再有单一的VBO I时,只有VAO。

我必须单独获得所有VBO,然后为每个VBO调用glDeleteBuffers吗?还是有一种方法可以使用VAO并自动处理所有VBO?

有人能告诉我们如何从VAO中获取VAO吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-07 03:36:39

您需要显式地删除所有VBO,方法是为它们调用glDeleteBuffers()

您最好的选择是保留您生成的VBO is,并在不再需要它们时删除它们,这通常与删除VAOs的时间差不多。除非VBO中的数据是完全静态的,否则通常需要它们的is,这样就可以绑定它们,并使用像glBufferSubData()这样的调用更新它们的数据。

要获得当前绑定的VAO的VBO,可以使用glGetVertexAttribiv()。要枚举所有这些代码,代码如下所示:

代码语言:javascript
复制
GLint nAttr = 0;
glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &nAttrib);
glBindVertexArray(vaoId);
for (int iAttr = 0; iAttr < nAttr; ++iAttr) {
    GLint vboId = 0;
    glGetVertexAttribiv(iAttr, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, &vboId);
    if (vboId > 0) {
        ...
    }
}

在使用它删除VBO时,您必须小心,因为相同的VBO可以绑定到多个属性。因此,您必须首先创建一个唯一ids的列表,例如将它们放到一个std::set中。如果您对多个VAOs使用相同的VBO,则会变得更加棘手,这当然是完全合法的,而且非常常见。

为了完整起见,我还会提到一个选项。我不建议这么做。这依赖于这样一个事实,即只要VBO绑定到VAO中的属性,VBO就会存活。因此,理论上,在用数据填充VAO并将它们绑定到VAO属性之后,可以在VAO上调用glDeleteBuffers()。虽然在您删除它们之后,它们的id将是无效的,但是数据将一直有效,直到最后一个引用缓冲区的VAO被删除。

最后一种方法有一些方面可以让你很容易地朝自己的脚开枪。如果您正在认真考虑使用它,您应该仔细阅读GL4.4规范第5.1.3节中以“在删除附在容器对象上的对象时应小心”开头的段落,或GL3.3规范附录D.1.2中相同的段落。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25167562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档