2

PRE : ライトが正しく描画されます。

問題: モデルの変更により手動でライトを削除 (または強制initializeGL()) すると、ライトが描画されます。

新しいモデルをロードすると、すべての古いオブジェクト ライトが新しいオブジェクト内に描画されます。QTを使用していPaintGL()ます。

これは、ライトを描画するメソッドです。

if (!mLightsList.isEmpty()){     //if the list of lights is NOT empty
    glEnable(GL_LIGHTING);
    QList<Light *> LightsTempList=mLightsList;
    for (int k=0;k<LightsTempList.count();k++) {
        glEnable(GL_LIGHT0+k);
        Light* first= LightsTempList.first();
        float light_diffuse[] = {33, 33, 33, 0.5};
        float light_color[] = {255, 0, 0, 0.5};
        float light_ambient[] = {255, 0, 0, 0.5};
        float light_position[] = {first->Position().x, first->Position().y, first->Position().z,0 };
        if (first->Type()==Default){
            glLightfv(GL_LIGHT0+k, GL_DIFFUSE, light_diffuse);
            glLightfv(GL_LIGHT0+k, GL_POSITION, light_position);
            glLightfv(GL_LIGHT0+k, GL_COLOR, light_color);
            glLightfv(GL_LIGHT0+k, GL_AMBIENT, light_ambient);
        }
        else
        ...
        LightsTempList.removeFirst();
        glDisable(GL_LIGHT0+k);
    }
}
glDisable(GL_LIGHTING);
}

これはレンダリング関数 (PaintGL()) です。

{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glViewport (0, 0, mScreenWidth, mScreenHeight);
gluLookAt(mObjCamera->Pos().x,  mObjCamera->Pos().y,  mObjCamera->Pos().z,
              mObjCamera->View().x, mObjCamera->View().y, mObjCamera->View().z,
              mObjCamera->Up().x,   mObjCamera->Up().y,   mObjCamera->Up().z);

DrawGLLights();
DrawGrid();
DrawAxis();
}

そして私の InitializeGL() メソッド:

void Preview::initializeGL()
{
glClearColor(0.8215, 0.8215, 0.745,0.5f);
glShadeModel(GL_SMOOTH);
glEnable(GL_LINE_SMOOTH);
glEnable(GL_MULTISAMPLE);
glHint( GL_LINE_SMOOTH_HINT, GL_NICEST );
glEnable(GLUT_MULTISAMPLE);
glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glEnable(GL_CULL_FACE);

mLightsList.clear();
mHitsList.clear();
BuildObjectsLists(mScene,1);
BuildObjectsLists(mScene,0);
}
4

1 に答える 1

4

まず第一に、OpenGL の初期化のようなものはありません。その initializeGL 関数を呼び出すと、何もリセットされません。いくつかの状態変数を既知の値に設定するだけです。しかし、その関数は do 照明に関連する OpenGL の状態をリセットしないので、その場合はまったく役に立ちません。

ライトが描画されないため、DrawGLLights という名前は不適切です。これらは、ライティングを適用するジオメトリを描画する前に設定した状態です。軸とグリッドが GL_LINES を使用して描画され、固定関数パイプラインを使用してうまく照射されないと仮定すると、実際に照らされる可能性のあるジオメトリを描画するコードが表示されません (そのためには、ストランド イルミネーション シェーダーが必要です)。 .

最後になりましたが、回避できる場合は固定関数パイプラインを使用しないでください。

于 2013-09-18T08:40:05.530 に答える