【问题标题】:OpenGL light source "fails to render" when camera moved past a certain point?当相机移过某个点时,OpenGL 光源“无法渲染”?
【发布时间】:2012-05-19 13:32:18
【问题描述】:

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

...

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

更新:不要被球的阴影弄糊涂了,它只是位于球下方的启用透明的纹理,它不是真正的阴影。

【问题讨论】:

  • 我改变了我的答案。怎么样?

标签: opengl lighting


【解决方案1】:

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

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

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

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

【讨论】:

  • 但我不明白为什么它会突然损坏。是关于相机平截头体和渲染的顶点列表吗?如果是,我如何强制它按照第一个屏幕截图中的方式运行?
  • @canpoyrazoğlu 首先您必须使用 4D 矢量,然后我已添加到答案中。
  • 位置向量中的第三个分量什么也没做,但我留下了它,因为它也是无害的。问题是相机的光线和相对位置。我把它改回来了,它就解决了。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-04-14
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
相关资源
最近更新 更多