问题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
什么是我可以为分配缓冲区对象的最大内存量? 它必须依赖于系统的课程,但我似乎无法找到它的估计。 当显存不够大,会发生什么? 我怎么会知道?
回答1
这取决于。 如果你叫glDeleteBuffers
之前,当你删除它VAO将被删除。 如果没有,也不会。 该VAO持有的VBO参考,并调用后使您的应用程序glGenBuffers
。 这两个引用需要的VBO被删除之前被释放。
答案2
有(据我所知)没有办法查询,你可以分配的最大金额。 然而,根据该参考文献 , glBufferData
将发出GL_OUT_OF_MEMORY
如果缓冲器不能被分配。
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
错误。