我是OpenGL的新手,正在学习VBO和VAOs。我正在尝试理解如何在VAO中释放/释放/分离VBO,当我不再有单一的VBO I时,只有VAO。
我必须单独获得所有VBO,然后为每个VBO调用glDeleteBuffers吗?还是有一种方法可以使用VAO并自动处理所有VBO?
有人能告诉我们如何从VAO中获取VAO吗?
发布于 2014-08-07 03:36:39
您需要显式地删除所有VBO,方法是为它们调用glDeleteBuffers()。
您最好的选择是保留您生成的VBO is,并在不再需要它们时删除它们,这通常与删除VAOs的时间差不多。除非VBO中的数据是完全静态的,否则通常需要它们的is,这样就可以绑定它们,并使用像glBufferSubData()这样的调用更新它们的数据。
要获得当前绑定的VAO的VBO,可以使用glGetVertexAttribiv()。要枚举所有这些代码,代码如下所示:
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中相同的段落。
https://stackoverflow.com/questions/25167562
复制相似问题