1: Buffer objects are not "created under" VAOs. Buffer object state is not part of VAO state. VAOs can reference buffer objects, but that association is only made by calling glVertexAttribPointer
(or other *Pointer calls). Simply binding a buffer to GL_ARRAY_BUFFER
does not put it in the VAO. You can bind buffers to that target without a VAO being bound. This is legal code:
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
Note that this is not true of GL_ELEMENT_ARRAY_BUFFER
. That binding is directly part of VAO state. So you need a VAO bound before you can bind to that target.
However, binding to a target is not creation. You can bind a buffer to GL_TRANSFORM_FEEDBACK_BUFFER
, create it's storage with glBufferData, and then bind it later for use with GL_ARRAY_BUFFER
. Or as a GL_ELEMENT_ARRAY_BUFFER
.
As to the main thrust of your question, no. The destruction of a VAO will not destroy the buffer objects that it references.
2: There is no standard OpenGL function to detect the amount of available resources. If you attempt to create storage and the implementation is out of resources, you will get a GL_OUT_OF_MEMORY?
error.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…