I have a really wierd problem using OpenGL. I've verified all my code passes the correct mesh, correct texture, to the correct shader.
When I use the same texture with multiple instances of the same mesh and the same shader located at different locations on the screen it shows up properly. When using other shaders and other meshes and other textures the scene appears correct.
However when I use same mesh, same shader, but bind alternate textures for rendering my textures get shuffled. There is an object at the position it is suppose to be, but the texture displayed at that location is different. It appears to be mis-binded exactly the same way.
My guess I'm missing something to tell the render to wait before processing the next instance and somehow the texture binding gets affected!
// Note: I've trimmed the code but
// nSrcBlend = GL_ONE and nDstBlend = GL_ZERO
void DrawStageMesh( iMESH eMesh, iTEXTURE eTexture, uint nSrcBlend, uint nDstBlend )
{
MeshObject *pObj;
GLuint iTex;
pObj = &pStageMesh[ eMesh ];
if (pObj->nCount)
{
glEnable( GL_TEXTURE_2D );
iTex = GetPixMap( eTexture )->getName();
// I've verified that iTex is the correct texture name!!!
glBindTexture(GL_TEXTURE_2D, iTex);
glEnableClientState( GL_VERTEX_ARRAY );
glEnableClientState( GL_TEXTURE_COORD_ARRAY );
if (pObj->pNormAry)
{
glEnableClientState( GL_NORMAL_ARRAY );
glNormalPointer( GL_FLOAT, 0, pObj->pNormAry );
}
glVertexPointer( 3, GL_FLOAT, 0, pObj->pVertAry );
glTexCoordPointer( 2, GL_FLOAT, 0, pObj->pUVAry );
glDrawArrays( GL_TRIANGLES, 0, pObj->nCount * 3 );
glDisableClientState( GL_VERTEX_ARRAY );
glDisableClientState( GL_TEXTURE_COORD_ARRAY );
if (pObj->pNormAry)
{
glDisableClientState( GL_NORMAL_ARRAY );
}
// I've tried the followng but didn't help!
// glBindTexture(GL_TEXTURE_2D, 0);
glDisable( GL_TEXTURE_2D );
}
}
// the following code snippet is included within other code and
// called for each instance of the object. The Shader constants
// are set with the object matrix, position and world matrix for the
// shader to use!
cgGLBindProgram( OdometerCgVertexProgram);
// Shader constants are setup then the following is called!
cgGLEnableProfile( TheCgVertexProfile );
DrawStageMesh( iMESH_CYLINDER01, eTex, GL_ONE, GL_ZERO );
cgGLDisableProfile( TheCgVertexProfile );