Освещение 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()
сбрасывает текущую нормаль к значению по умолчанию. Это не так.