我正在 OpenGL 中制作一个小型模拟游戏,其中有一个球在场中,并且相机被锁定以从顶部的某个角度查看球(请参见下面的屏幕截图)。一切正常,但是,当相机经过某个点时,墙上的照明会失效。就好像在新创建的场景中“没有灯光”一样。
这是正确的:
这是当相机从某个点经过时,左侧墙上的照明被重置:
它不会逐渐发生。它在相机移动时突然发生。这是我绘制墙壁的代码:
glBindTexture(GL_TEXTURE_2D, brickTexture);
glCallList(wallObjectID);
列表在前面定义的位置:
glNewList(wallObjectID, GL_COMPILE);
glBegin(GL_QUADS);
glNormal3f(0, 90, 0);
glTexCoord2f(0, 0);
glVertex3f(0, 0, 0);
glTexCoord2f(0, 1);
glVertex3f(0, level->length, 0);
glTexCoord2f(2, 1);
glVertex3f(0,level->length, 100);
glTexCoord2f(2, 0);
glVertex3f(0, 0, 100);
glNormal3f(90, 0, 0);
glTexCoord2f(0, 0);
glVertex3f(0, 0, 100);
glTexCoord2f(0, 2);
glVertex3f(level->width, 0, 100);
glTexCoord2f(2, 2);
glVertex3f(level->width, 0, 0);
glTexCoord2f(2, 0);
glVertex3f(0, 0, 0);
glEnd();
glEndList();
以下是在程序开始时初始化的 OpenGL 设置:
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glShadeModel(GL_SMOOTH);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
glEnable(GL_TEXTURE_2D);
glEnable(GL_DOUBLEBUFFER);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
float pos[] = { -30, -30, 30 };
float intensity[] = { 1,1,1,1 };
glLightfv(GL_LIGHT0, GL_POSITION, pos);
glLightfv(GL_LIGHT0, GL_SPECULAR, intensity);
glLightfv(GL_LIGHT1, GL_POSITION, pos);
glLightfv(GL_LIGHT1, GL_SPECULAR, intensity);
float diff[] = { 0.6f, 0.6f, 0.75f };
glLightfv(GL_LIGHT1, GL_DIFFUSE, diff);
...
问题的原因可能是什么?谢谢你。
更新:不要对球的阴影感到困惑,它只是位于球下方的启用透明的纹理,它不是真正的阴影。