【问题标题】:OpenGL lighting problem when rotating the camera旋转相机时的OpenGL照明问题
【发布时间】:2009-12-16 21:12:01
【问题描述】:

我在我的游戏世界中绘制建筑物,我使用以下代码为它们着色:

GLfloat light_ambient[] = {0.0f, 0.0f, 0.0f, 1.0f};
GLfloat light_position[] = {135.66f, 129.83f, 4.7f, 1.0f};

glShadeModel(GL_SMOOTH);

glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);

glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);

glColorMaterial(GL_FRONT, GL_AMBIENT);

效果很好。

但是当我开始在世界中飞行时,灯光会对此做出反应,就好像世界是一个正在旋转的物体一样。所以当我的相机角度改变时,灯光也会改变。

如何恢复旋转?所以灯光会认为我实际上并没有在旋转世界,然后我可以使我的建筑物具有静态阴影,该阴影会根据太阳在天空中的位置而变化。

编辑:这里是渲染代码:

int DrawGLScene()
{

    // stuff

    glLoadIdentity();

    glRotatef(XROT, 1.0f, 0.0f, 0.0f);
    glRotatef(YROT, 0.0f, 1.0f, 0.0f);
    glRotatef(ZROT, 0.0f, 0.0f, 1.0f);

    glTranslatef(-XPOS, -YPOS, -ZPOS);

    // draw world
}

【问题讨论】:

  • 问题可能出在您的移动/旋转代码中,也将其发布。
  • 添加渲染代码

标签: opengl lighting


【解决方案1】:

http://www.opengl.org/resources/faq/technical/lights.htm

参见 #18.050

简而言之,您需要确保在正确的参考帧中定义灯光位置,并在每一帧应用适当的变换以将其保持在您想要的位置。

编辑:

随着 OpenGL 3.1 中固定功能管道的移除,此处的代码和答案已被弃用。现在正确的答案是将您的灯光位置传递到您的顶点/片段着色器并使用该位置在世界空间中执行您的着色。此计算因您正在执行的照明类型(PBR、phong、延迟等)而异。

【讨论】:

    【解决方案2】:

    我相信您的问题是由于 OpenGL 灯光是在世界坐标中指定的,但在内部存储在相机坐标中。这意味着一旦你放置了一个灯光,每当你移动你的相机,你的灯光就会随之移动。

    要解决此问题,只需在移动相机时重新定位灯光即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多