问题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);
Run Code Online (Sandbox Code Playgroud)
以后打电话时glDeleteVertexArrays(1, &VAO);,会bufferObject被删除吗?
我问的原因是我在网上看到了一些没有删除那些缓冲区对象的例子.
问题2
我可以为缓冲区对象分配的最大内存量是多少?它当然必须是系统依赖的,但我似乎无法找到它的估计.当视频RAM不够大时会发生什么?我怎么会知道?
Nic*_*las 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
Run Code Online (Sandbox Code Playgroud)
请注意,这不是真的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?错误.