4

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

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
}
4

2 回答 2

4

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

见#18.050

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

编辑:

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

于 2009-12-16T21:22:21.097 回答
2

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

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

于 2009-12-16T21:22:35.870 回答