Hi,
I am trying to render using VAO, everything works fine but I just want to understand something.
When I initialize my opengl context using Qt I do also create a VAO this way :
Code :glGenVertexArrays(1, &vao); glGenBuffers(1, &vertexBuffer); glGenBuffers(1, &indexBuffer); glBindVertexArray(vao); glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); glBufferData(GL_ARRAY_BUFFER, 3*vertices.size() * sizeof(GL_FLOAT), vertices.constData(), GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); glEnableVertexAttribArray(0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, 3*indices.size() * sizeof(GL_FLOAT), indices.constData(), GL_STATIC_DRAW); glBindVertexArray(0);
You see that glEnableVertexAttribArray(0); is already there.
However when I want to render (after compiling, linking my shader), I have to use this code in order to have something rendered at my screen.
Code :shaderProgram.bind(); //UNIFORMS shaderProgram.setUniformValue("mvpMatrix", pMatrix * view * model); shaderProgram.setUniformValue("color", QColor(255,244,255)); //ARRAYS //VERTEX ARRAY glBindVertexArray(vao); glEnableVertexAttribArray(0); glDrawElements(rendStyle, indices.size(), GL_UNSIGNED_INT, 0); glDisableVertexAttribArray(0); //RELEASE SHADER shaderProgram.release();
So there is a repetition of glEnableVertexAttribArray(0), If I remove this latter from the rendering part nothing is drawn at the screen.
Now, I don't understand why I have to use glEnableVertexAttribArray(0) in the rendering part since it was already set up in the vao (initilization part).
Thanks.



Reply With Quote
). So, many VAO changes incur a significant cost and it is probably wise to limit them as much as possible. That means you put as much data into a VBO and IBO referenced by a VAO as possible and draw as many objects from a single data store as possible. You can either do so by providing correctly shifted indices and simply indicate the offset into the index buffer with glDrawElements() or you can go the easy route and use glDrawElementsBaseVertex() and similar. 