 <p>glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT) saves all the client side states for all vertex array attributes. So everything you set with the glEnableClientState/glDisableClientState and gl*Pointer functions. It won't copy the actual data. It also won't save anything set with glBindBuffer/glBufferData because those would be server side states. There's probably an enum for glPushAttrib for that in normal OpenGL (no glPushAttrib in OpenGL ES either).</p> <p>I'm guessing that the difference between VBO and vertex array here is that VBOs have their actual data in graphics memory, while vertex arrays have to be streamed to the graphics card when you draw them. Pointers and enabled flags will still be saved with glPushClientAttrib when you are using VBOs, though.</p> <p>For OpenGL ES you have to keep track of the states yourself if you want to return to the last state. Or better, set everything to default values after you are finished with it (calling glDisableClient for all enabled vertex arrays should be enough).</p>