Domanda

I write a switch structure below to choose different scenes. For each case with a different scene, I enable something like lights, color material and depth test while I also disable them respectively in the end of this case. However, when switching between those scenes, something come wrong. Like, if I go to scene 3 first then go to scene 1, scene 1 seems affected by something extra from scene 3, such as unexpected light and material property would appear in scene 1.

Since I use different LIGHT in each scene, I don't think it's caused by lighting. However, I failed to see anything wrong in the material setting.

Could anyone give me some hint?

switch(m_iSceneNum)
{
case 1:
    glClearColor(0, 0, 0, 1);
    glEnable(GL_DEPTH_TEST);
    glShadeModel(GL_SMOOTH);

    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, fNoLight);
    glLightfv(GL_LIGHT1, GL_AMBIENT, fLowLight);
    glLightfv(GL_LIGHT1, GL_DIFFUSE, fBrightLight);
    glLightfv(GL_LIGHT1, GL_SPECULAR, fBrightLight);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT1);

    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
    glMateriali(GL_FRONT, GL_SHININESS, 128);
    glMaterialfv(GL_FRONT, GL_SPECULAR, fSpec);
    ////////////////////////////////////////////////////////

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60, 1, 1, 4000);

    gluLookAt(0, 0 , 50.0f ,0.0f, 0.0f , 0.0f , 0.0f , 1.0f , 0.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glLightfv(GL_LIGHT1, GL_POSITION, fLightPos1);
    glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, fLightDirection1);
    glLightfv(GL_LIGHT1, GL_SPOT_CUTOFF, fLightCutoff1);

    glColor3f(1,0,0);
    glBegin(GL_QUADS);
    glVertex3f(-10, 10, -10);
    glVertex3f(10, 10, -10);
    glVertex3f(10, -10, 10);
    glVertex3f(-10, -10, 10);
    glEnd();

    glDisable(GL_COLOR_MATERIAL);
    glDisable(GL_LIGHT1);
    glDisable(GL_LIGHTING);

    glDisable(GL_DEPTH_TEST);
    glFlush();
    break;
case 3:
    glClearColor(0, 0, 0, 1);
    glEnable(GL_DEPTH_TEST);
    glShadeModel(GL_SMOOTH);

    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, fNoLight);
    glLightfv(GL_LIGHT3, GL_AMBIENT, fLowLight);
    glLightfv(GL_LIGHT3, GL_DIFFUSE, fBrightLight);
    glLightfv(GL_LIGHT3, GL_SPECULAR, fBrightLight);

    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT3);

    glEnable(GL_COLOR_MATERIAL);
    glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
    glMaterialfv(GL_FRONT, GL_SPECULAR, fSpec);
    glMateriali(GL_FRONT, GL_SHININESS, 0);
    ////////////////////////////////////////////////////////
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60, 1, 1, 4000);

    gluLookAt(0, 0, 10.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glLightfv(GL_LIGHT3, GL_POSITION, fLightPos3);

    glRotatef(m_fAngle, 0, 0, 1);
    glBegin(GL_TRIANGLES);
    glColor3f(1,0,0);
    glNormal3f(0, 0, -1);
    glVertex3f(0, 5, 0);
    glColor3f(0,1,0);
    glNormal3f(1, 1 ,1);
    glVertex3f(5, 0, 0);
    glColor3f(0,0,1);
    glNormal3f(0, 1, 1);
    glVertex3f(-5, 0, 0);
    glEnd();

    glDisable(GL_LIGHT3);
    glDisable(GL_LIGHTING);
    glDisable(GL_COLOR_MATERIAL);
    glDisable(GL_DEPTH_TEST);
    glFlush();
    break;
default:
    break;
}
È stato utile?

Soluzione

You never provide normal(s) for the quad in case 1.

So you'll get the default normal (if case 1 is the first/only thing executed) or the last normal you set in case 3.

It's as if you're assuming glEnd() resets the current normal to the default somehow. It doesn't.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top