I'm trying to render large models using vertex buffer objects however I get incredibly poor performance. The problem seems to be related to glDisableClientState (GL_VERTEX_ARRAY);
Here is a code fragment which is executed each frame:
#ifdef HAVE_ACCEL_GL
glBindBufferARB (GL_ARRAY_BUFFER_ARB, this->vertex_buffer_id_);
#endif
glEnableClientState (GL_VERTEX_ARRAY);
glEnableClientState (GL_NORMAL_ARRAY);
glEnableClientState (GL_TEXTURE_COORD_ARRAY);
for (int i = 0; i < this->buffer_metadata_size_; i++)
{
VertexBufferMetadata& metadata = this->buffer_metadata_[i];
Surface* this_surface = metadata.surface;
this_surface->enable ();
// Acceleration points need to be relative to the start of the buffer
char * offset = this->acceration_available() ? this->buffer_ : 0;
glVertexPointer (3, GL_FLOAT, 0, ptr (metadata.vertex_offset - offset));
glNormalPointer ( GL_FLOAT, 0, ptr (metadata.normal_offset - offset));
glTexCoordPointer (3, GL_FLOAT, 0, ptr (metadata.texcoord_offset - offset));
glDrawArrays (GL_TRIANGLES, 0, metadata.vertex_count);
this_surface->disable ();
}
glDisableClientState (GL_VERTEX_ARRAY);
glDisableClientState (GL_NORMAL_ARRAY);
glDisableClientState (GL_TEXTURE_COORD_ARRAY);
For a modest sized model containing about 100,000 triangles I get a framerate of 4 fps. If I comment out the calls to glDisableClientState then the framerate climbs to about 32 fps (on a modest GeForce 2 Go laptop).
Why does this make such a huge difference? What am I doing wrong?
:sigh:
Any help is much appreciated.











