<snickers> Okay, now I really feel stupid. I left out two really important things:
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
Now, I’m getting ~73 FPS with a single textured cube and ~45 with a multitextured cube. But, I’m still getting some weird behavior.
The cube is spinning in multiple directions (about x, y, and z axes). It starts spinning really fast, then instantly slows down, then picks right back up again. It almost seems like the first few faces can be drawn quickly, but the back three faces take longer. Here’s my rendering code:
// … SNIP …
// Rotate and translate
theta+=1.0f;
if (theta>360.0f) theta-=360.0f;
phi+=0.3333f;
if (phi>360.0f) phi-=360.0f;
psi+=0.67653;
if (psi>360.0f) psi-=360.0f;
glTranslatef(0.0f,0.0f,-5.0f);
glRotatef(theta,1.0f,0.0f,0.0f);
glRotatef(phi,0.0f,0.233f,0.0f);
glRotatef(psi,0.0f,0.0f,0.872f);
glCallList(cube);
glFlush();
// … SNIP …
int Engine::InitCube()
{
int retVal=glGenLists(1);
glNewList(retVal,GL_COMPILE);
glBegin(GL_QUADS);
{
// Front Face
glNormal3f(0.0f,0.0f,1.0f);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0.0f,0.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0.0f,0.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1.0f,0.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,1.0f,0.0f);
glVertex3f( 1.0f,-1.0f, 1.0f);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1.0f,1.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,1.0f,1.0f);
glVertex3f( 1.0f, 1.0f, 1.0f);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0.0f,1.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0.0f,1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
// Back Face
glNormal3f(0.0f,0.0f,-1.0f);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0.0f,0.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0.0f,0.0f);
glVertex3f( 1.0f,-1.0f,-1.0f);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1.0f,0.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,1.0f,0.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1.0f,1.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,1.0f,1.0f);
glVertex3f(-1.0f, 1.0f,-1.0f);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0.0f,1.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0.0f,1.0f);
glVertex3f( 1.0f, 1.0f,-1.0f);
// Left Face
glNormal3f(-1.0f,0.0f,0.0f);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0.0f,0.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0.0f,0.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1.0f,0.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,1.0f,0.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1.0f,1.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,1.0f,1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0.0f,1.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0.0f,1.0f);
glVertex3f(-1.0f, 1.0f,-1.0f);
// Right Face
glNormal3f(1.0f,0.0f,0.0f);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0.0f,0.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0.0f,0.0f);
glVertex3f( 1.0f,-1.0f, 1.0f);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1.0f,0.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,1.0f,0.0f);
glVertex3f( 1.0f,-1.0f,-1.0f);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1.0f,1.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,1.0f,1.0f);
glVertex3f( 1.0f, 1.0f,-1.0f);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0.0f,1.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0.0f,1.0f);
glVertex3f( 1.0f, 1.0f, 1.0f);
// Top Face
glNormal3f(0.0f,1.0f,0.0f);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0.0f,0.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0.0f,0.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1.0f,0.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,1.0f,0.0f);
glVertex3f( 1.0f, 1.0f, 1.0f);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1.0f,1.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,1.0f,1.0f);
glVertex3f( 1.0f, 1.0f,-1.0f);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0.0f,1.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0.0f,1.0f);
glVertex3f(-1.0f, 1.0f,-1.0f);
// Bottom Face
glNormal3f(0.0f,-1.0f,0.0f);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0.0f,0.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0.0f,0.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1.0f,0.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,1.0f,0.0f);
glVertex3f( 1.0f,-1.0f,-1.0f);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1.0f,1.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,1.0f,1.0f);
glVertex3f( 1.0f,-1.0f, 1.0f);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0.0f,1.0f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0.0f,1.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);
}
glEnd();
glEndList();
return retVal;
}
I apologize for the length of this code. InitCube only gets called once, and stored into a value “cube”. Any thoughts?