I have a question about the order of these function calls:
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
Is it really necessary to bind a buffer before calling glVertexAttribPointer? glVertexAttribPointer sets the size, type, stride, normalization, and pointer (essentially an offset) into a buffer. It seems to me that these state values could be set without binding a buffer. Is this the case?