OpenGL的顶点数组/缓冲区对象(OpenGL Vertex Array/Buffer Objec

2019-08-02 15:11发布

问题1

不要在一定VAO创建顶点缓冲对象删除一旦VAO被删除?

一个例子:

glGenBuffers(1, &bufferObject);
glGenVertexArrays(1, &VAO);

glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, bufferObject);
glBufferData(GL_ARRAY_BUFFER, sizeof(someVertices), someVertices, 
             GL_STATIC_DRAW);
glEnableVertexAttribArray(positionAttrib);
glVertexAttribPointer(positionAttrib, 3, GL_FLOAT, GL_FALSE, 0, NULL);

当稍后再打glDeleteVertexArrays(1, &VAO); ,将bufferObject被删除?

我问的原因是我看到的几个例子在未删除这些缓冲对象的网页。

问题2

什么是我可以为分配缓冲区对象的最大内存量? 它必须依赖于系统的课程,但我似乎无法找到它的估计。 当显存不够大,会发生什么? 我怎么会知道?

Answer 1:

回答1

这取决于。 如果你叫glDeleteBuffers之前,当你删除它VAO将被删除。 如果没有,也不会。 该VAO持有的VBO参考,并调用后使您的应用程序glGenBuffers 。 这两个引用需要的VBO被删除之前被释放。

答案2

有(据我所知)没有办法查询,你可以分配的最大金额。 然而,根据该参考文献 , glBufferData将发出GL_OUT_OF_MEMORY如果缓冲器不能被分配。



Answer 2:

1:VAOs Buffer对象不是“下创建”。 缓冲区对象状态不是VAO状态的一部分。 VAOs 可以引用缓冲器的对象,但该关联仅通过调用由glVertexAttribPointer (或其它指针*呼叫)。 只要结合一个缓冲区来GL_ARRAY_BUFFER 不把它放在VAO。 您可以绑定缓存该目标没有VAO所束缚。 这是合法的代码:

glGenBuffers(1, &bufferObject);
glBindBuffer(GL_ARRAY_BUFFER, bufferObject);
glBufferData(GL_ARRAY_BUFFER, sizeof(someVertices), someVertices, 
             GL_STATIC_DRAW);  //Creates the buffer storage.

glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
glEnableVertexAttribArray(positionAttrib);
glVertexAttribPointer(positionAttrib, 3, GL_FLOAT, GL_FALSE, 0, NULL); //Uses whatever is bound to GL_ARRAY_BUFFER

请注意,这不是真正的GL_ELEMENT_ARRAY_BUFFER 。 这是结合直接VAO状态的一部分。 所以你需要一个VAO束缚,才能绑定到该目标。

然而,结合目标不是创造 。 您可以将缓存绑定到GL_TRANSFORM_FEEDBACK_BUFFER ,创建它的存储与glBufferData,再后来将其绑定与使用GL_ARRAY_BUFFER 。 或作为GL_ELEMENT_ARRAY_BUFFER

至于你的问题的主旨,没有。 一个VAO的破坏不会破坏它所引用的缓冲对象。

2:没有标准的OpenGL函数来检测可用的资源量。 如果试图创建存储和实现资源不足,你会得到一个GL_OUT_OF_MEMORY​错误。



文章来源: OpenGL Vertex Array/Buffer Objects
标签: opengl vbo vao