Original Post
I am a bit surprised that it seems like my VAOs get invalidated each time that I provide new buffer data. Are you really supposed to do glEnableClientState and setup gl*Pointers all over again after each glBufferSubData? That would make VAOs pretty useless for dynamic vertex data, wouldn't it?
I was hoping that it would be more like this:
However, it seems like I need to do this in order for it to work:
Is this reallly necessary or am I doing something else wrong?
I was hoping that it would be more like this:
// Initialization (Once)
glGenVertexArrays(1, &vao);
glGenBuffers(1, &vbo);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, size * sizeof(vertex_t), vertices, GL_DYNAMIC_DRAW);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(vertex_t), (GLvoid*)(0 * sizeof(vec3_t)));
glNormalPointer(GL_FLOAT, sizeof(vertex_t), (GLvoid*)(1 * sizeof(vec3_t)));
glColorPointer(4, GL_FLOAT, sizeof(vertex_t), (GLvoid*)(2 * sizeof(vec3_t)));
glTexCoordPointer(2, GL_FLOAT, sizeof(vertex_t), (GLvoid*)(2 * sizeof(vec3_t) + sizeof(vec4_t)));
glBindVertexArray(0);
// Update (Each Frame)
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferSubData(GL_ARRAY_BUFFER, 0, size * sizeof(vertex_t), vertices);
glBindVertexArray(0);
// Render (Each Frame)
glBindVertexArray(vao);
glBindTexture(GL_TEXTURE_2D, texture);
glDrawArrays(GL_TRIANGLES, 0, size);
glBindVertexArray(0);
However, it seems like I need to do this in order for it to work:
// Update (Each Frame)
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferSubData(GL_ARRAY_BUFFER, 0, size * sizeof(vertex_t), vertices);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(vertex_t), (GLvoid*)(0 * sizeof(vec3_t)));
glNormalPointer(GL_FLOAT, sizeof(vertex_t), (GLvoid*)(1 * sizeof(vec3_t)));
glColorPointer(4, GL_FLOAT, sizeof(vertex_t), (GLvoid*)(2 * sizeof(vec3_t)));
glTexCoordPointer(2, GL_FLOAT, sizeof(vertex_t), (GLvoid*)(2 * sizeof(vec3_t) + sizeof(vec4_t)));
glBindVertexArray(0);
Is this reallly necessary or am I doing something else wrong?