问题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
我可以为缓冲区对象分配的最大内存量是多少?它当然必须是系统依赖的,但我似乎无法找到它的估计。当视频RAM不够大时会发生什么?我怎么知道?
答案 0 :(得分:15)
1:缓冲区对象不是“在”VAO下创建的。缓冲对象状态不是VAO状态的一部分。 VAO可以引用缓冲区对象,但只能通过调用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绑定才能绑定到那个目标。
但是,绑定到目标是 not creation 。您可以将缓冲区绑定到GL_TRANSFORM_FEEDBACK_BUFFER
,使用glBufferData创建它的存储,然后稍后绑定它以与GL_ARRAY_BUFFER
一起使用。或者作为GL_ELEMENT_ARRAY_BUFFER
。
关于你问题的主旨,没有。销毁VAO不会破坏它引用的缓冲区对象。
2:没有标准的OpenGL功能来检测可用资源的数量。如果您尝试创建存储并且实施资源不足,则会出现GL_OUT_OF_MEMORY
错误。
答案 1 :(得分:8)
回答1
这取决于。如果您之前致电过glDeleteBuffers
,则在删除VAO时会将其删除。如果没有,它就不会。 VAO持有对VBO的引用,调用glGenBuffers
后您的应用程序也是如此。在删除VBO之前,需要释放这两个引用。
回答2
有(afaik)无法查询您可以分配的最大金额。但是,根据reference documentation,如果无法分配缓冲区,glBufferData
将发出GL_OUT_OF_MEMORY
。