1

我正在 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);

...

问题的原因可能是什么?谢谢你。

更新:不要对球的阴影感到困惑,它只是位于球下方的启用透明的纹理,它不是真正的阴影。

4

1 回答 1

2

您没有正确设置灯光的位置。您已经使用了 3D 矢量 - 位置。但根据功能文档,您必须使用 4D 矢量。

第 4 个 (w) 分量表示光是定向光还是点光,1 表示它是点光。1 以外的其他值将导致不正确的翻译,例如。w = 500,您将平移 3 点,然后您的灯光移动 1500 点。

此外,当您更改模型视图矩阵以进行世界平移(相机移动)时,您还必须设置每个灯光的位置,因为当您移动世界时,灯光不会随世界移动,这意味着灯光始终在摄像头前面,即。它正在移动(锁定到)相机。读这个

在调用 glLight*() 指定位置时,当前 ModelView 矩阵会转换灯光的位置

于 2012-05-19T13:43:52.170 回答