Hi. I ! need to create a shadow from the sun on a flat map of the earth without using shaders. The Mercator projection is used. I created an example with a ball and a flat Mercator projection map. In the picture, the red ball and blue square are created without using textures and there is a shadow, but as soon as I apply the textures (the green square), the shadow disappears. What could be the problem?
void Widget::initializeGL()
{
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
glShadeModel(GL_SMOOTH);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glEnable(GL_BLEND);
glEnable(GL_ALPHA_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);
glEnable(GL_NORMALIZE);
glDisable(GL_AUTO_NORMAL);
Figure();
}
void Widget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
#if 1
float lat = M_PI/8, lon = M_PI/3;
float LightPos[] = { cos(lat)*sin(lon), sin(lat), cos(lat)*cos(lon), 0.0f };
float fAmbientShadow[] = { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat material_diffuse[] = {1.0, 1.0, 1.0, 1.0};
glMaterialfv(GL_FRONT, GL_DIFFUSE, material_diffuse);
glLightfv(GL_LIGHT0, GL_POSITION, LightPos);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, fAmbientShadow);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
#endif
// blue ball
glTranslated(0.0, -2.0, -10.0);
qglColor(Qt::blue);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
#if 1
glBindTexture(GL_TEXTURE_2D, tex);
glNormalPointer(GL_DOUBLE, 0, normal1.data());
glVertexPointer(3, GL_DOUBLE, 0, coord1.data());
glDrawArrays(GL_QUADS, 0, coord1.size()/3);
#endif
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
// red square
glTranslated(0.0, 3.0, 0.0);
qglColor(Qt::red);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
#if 1
glVertexPointer(3, GL_DOUBLE, 0, coord2.data());
glNormalPointer(GL_DOUBLE, 0, normal2.data());
glDrawArrays(GL_QUADS, 0, coord2.size()/3);
#endif
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
// green square
glTranslated(3.0, -3.0, 0.0);
glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
#if 1
glBindTexture(GL_TEXTURE_2D, tex);
glVertexPointer(3, GL_DOUBLE, 0, coord2.data());
glNormalPointer(GL_DOUBLE, 0, normal2.data());
glTexCoordPointer(2, GL_DOUBLE, 0, texture.data());
glDrawArrays(GL_QUADS, 0, coord2.size()/3);
#endif
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
glDisable(GL_LIGHTING);
glDisable(GL_LIGHT0);
}