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、フォン、遅延など)によって異なります。

于 2009-12-16T21:22:21.097 に答える
2

あなたの問題は、OpenGLライトがワールド座標で指定されているが、カメラ座標で内部的に保存されているという事実から生じていると思います。つまり、ライトを配置すると、カメラを動かすたびに、ライトも一緒に動きます。

これを修正するには、カメラを動かすたびにライトの位置を変えるだけです。

于 2009-12-16T21:22:35.870 に答える