Освещение OpenGL и ошибка материала при переключении между различными сценами

Я пишу структуру переключателя ниже, чтобы выбрать разные сцены. Для каждого случая с другой сценой я включаю что-то вроде света, цветного материала и теста глубины, а также отключаю их соответственно в конце этого случая. Однако при переключении между этими сценами что-то не так. Например, если я сначала иду в сцену 3, а затем в сцену 1, сцена 1, кажется, затронута чем-то дополнительным из сцены 3, таким как неожиданный свет и свойство материала появятся в сцене 1.

Поскольку я использую разные СВЕТЫ в каждой сцене, я не думаю, что это вызвано освещением. Однако я не увидел ничего плохого в настройках материала.

Кто-нибудь может дать мне подсказку?

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

1 ответ

Решение

Вы никогда не предоставляете нормальный (ие) для четырехугольника case 1,

Таким образом, вы получите стандартное значение по умолчанию (если case 1 выполняется первая / единственная вещь) или последняя нормаль, которую вы установили в case 3,

Это как если бы вы предполагали glEnd() сбрасывает текущую нормаль к значению по умолчанию. Это не так.

Другие вопросы по тегам