フィールドにボールがあり、カメラが上からの角度からボールを見るようにロックされている 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);
...
問題の原因は何ですか? ありがとうございました。
更新: ボールの影に惑わされないでください。これは、ボールの下にある透明度が有効なテクスチャに過ぎず、実際の影ではありません。