Shadow without shader on flat map


Безымянный3|429x366

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);
}

This topic was automatically closed 183 days after the last reply. New replies are no longer allowed.