I'm currently programming an OpenGL ES 2.0 application on both iOS and Android platforms.
In this application I render multiple meshes that all use VBOs. In the process of optimizing the rendering, I realized that the meshes I render share two vertex formats. So I wanted to do the following:
First, setup all vertex attribute pointer offsets, and then simply bind each VBO that uses this vertex format and render it without calling the glVertexAttribPointer
function again.
But it gives me strange results.
My question is: Do we have to do the calls glVertexAttribPointer
each time we bind a new VBO?
First of all, like every OpenGL state, the state set with
glVertexAttribPointer
keeps unchanged until someone else callsglVertexAttribPointer
again (for the same attribute index). But the important thing here is, that the internal state changed withglVertexAttribPointer
doesn't just store the buffer offset to be used for rendering, offsetting into the VBO bound when callingglDraw...
. It also stores the actual buffer object bound when callingglVertexAttribPointer
.So yes, whenever you want your vertex data sourced from another VBO, you need to bind this VBO and do the appropriate
glVertexAttribPointer
calls while this VBO is bound. While this may seem cumbersome in your case, this is in fact a good thing. This way you don't need to worry about the currently bound buffer when rendering something, but only about the things set up withglVertexAttribPointer
. And even more important it let's bind a different VBO before rendering, thus you can source different vertex attributes from different VBOs in a single render call (how else would you do that?).EDIT: You can however use Vertex Array Objects to ease the process of setting up your vertex data. They encapsulate all the state neccessary for rendering from a bunch of arrays (and thus all the things changed by
glVertexAttribPointer
,gl(En/Dis)ableVertexAttribArray
and the buffer bound toGL_ELEMENT_ARRAY_BUFFER
, but like said, not the buffer bound toGL_ARRAY_BUFFER
). You still have to properly bind the buffer before callingglVertexAttribPointer
of course. But using a VAO you only need this code in some set up routine and all you need to do for rendering is callingglBindVertexArray
. Though I don't know if your particular ES device supports them.