Search code examples
openglvbovao

OpenGL Vertex Array/Buffer Objects


Question 1

Do vertex buffer objects created under a certain VAO deleted once that VAO is deleted?

An example:

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);

When later calling glDeleteVertexArrays(1, &VAO);, will bufferObject be deleted as well?

The reason I'm asking is that I saw a few examples over the web that didn't delete those buffer objects.

Question 2

What is the maximum amount of memory that I can allocate for buffer objects? It must be system dependent of course, but I can't seem find an estimation for it. What happens when video RAM isn't big enough? How would I know?


Solution

  • Answer 1

    It depends. If you called glDeleteBuffers before, it will be deleted when you delete the VAO. If not, it won't. The VAO holds a reference to the VBO, and so does your application after calling glGenBuffers. Both references need to be released before the VBO is deleted.

    Answer 2

    There's (afaik) no way to query the maximum amount you can allocate. However, according to the reference documentation, glBufferData will emit GL_OUT_OF_MEMORY if a buffer can not be allocated.