here it is :
// SETUP (once)
glFogi(GL_FOG_MODE, GL_LINEAR);
glFogf(GL_FOG_START, pEnv->GetFogStart());
glFogf(GL_FOG_END, pEnv->GetFogEnd());
glFogfv(GL_FOG_COLOR, color);
glFogi(GL_FOG_COORDINATE_SOURCE, GL_FRAGMENT_DEPTH);
glHint(GL_FOG_HINT, GL_NICEST);
glEnable(GL_FOG);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, color);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glAlphaFunc(GL_GREATER, 0.5f);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexEnvf(GL_TEXTURE_FILTER_CONTROL, GL_TEXTURE_LOD_BIAS, m_mipmappingBias);
glShadeModel(GL_SMOOTH);
glDisable(GL_AUTO_NORMAL);
glDisable(GL_NORMALIZE);
glDisable(GL_VERTEX_PROGRAM_TWO_SIDE_ARB);
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
this part is simplified for the post, I removed everything related to transparent faces, bump mapping, detail textures and other things…so
some states changes can be redundant or useless (and the “objects” section is originaly part of a loop)
I tested my application with 2 objects objects that correspond to this limitation and I get the same result.
// RENDER (each frame)
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightCol);
//---terrain
glDisable(GL_LIGHTING);
glDisable(GL_CULL_FACE);
glActiveTextureARB(GL_TEXTURE0_ARB);
glClientActiveTextureARB(GL_TEXTURE0_ARB);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_TEXTURE_2D);
// ... setup arrays
// render using glDrawRangeElements
//---water
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_CULL_FACE);
glNormal3f(0.0, 0.0, 1.0);
glDisable(GL_TEXTURE_2D);
// ... setup arrays
here is the vertex program...If I'm not using it, everything is ok
glEnable(GL_VERTEX_PROGRAM_ARB);
glBindProgramARB(GL_VERTEX_PROGRAM_ARB, vpID);
// render using glDrawArrays
glDisable(GL_VERTEX_PROGRAM_ARB);
glEnable(GL_CULL_FACE);
glDisableClientState(GL_COLOR_ARRAY);
if I'm using the vertex program for the water, I need to add:
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
before the next section
//---objects
glActiveTextureARB(GL_TEXTURE0_ARB);
glClientActiveTextureARB(GL_TEXTURE0_ARB);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
// ... setup material
glMaterialfv(GL_FRONT, GL_EMISSION, matEm);
glMaterialfv(GL_FRONT, GL_DIFFUSE, color);
glMaterialfv(GL_FRONT, GL_AMBIENT, matAmb);
glMaterialfv(GL_FRONT, GL_SPECULAR, matSpe);
glMaterialf(GL_FRONT, GL_SHININESS, matShi);
// ... setup arrays
// render using glDrawRangeElements
thanks for your time…