0

私は数か月間 OpenGL でコーディングしており、主に 3D で作業しています。私のinitメソッドは次のようになります:

private void initGl() {
    glViewport(0, 0, Display.getWidth(), Display.getHeight());
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    GLU.gluPerspective(45.0f, Display.getWidth() / Display.getHeight(), 1.0f, 100.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClearDepth(1.0f);
    glDepthFunc(GL_LEQUAL);
    glEnable(GL_DEPTH_TEST);
    glShadeModel(GL_SMOOTH);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    glEnable(GL_FOG);
    glFogi(GL_FOG_MODE, GL_EXP2);
    glFogf(GL_FOG_DENSITY, density);
    glHint(GL_FOG_DENSITY, GL_FASTEST);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);

    vbo = new VBO();
}

これはすべて必要ですか?適切な場所で loadIdentity() を呼び出すかどうか疑問に思っていますが、gluPerspective の後に呼び出す必要がありますか? 基本的に、いつ loadIdentity() を呼び出すのが適切ですか?

4

1 に答える 1

1

OpenGL の初心者によくある誤解は、OpenGL が何らかの形で「初期化」されているというものです。OpenGL は状態ベースの描画マシンです。つまり、「init」関数内のこれらすべての関数が、何らかの描画関連の状態を設定することを意味します。ステート マシンの特異な点は、実際に使用すると、必要なときに必要なときにすべての状態を設定できることです。つまり、「OpenGL の初期化」フェーズのようなものはありません。「init」関数の呼び出しのほとんどは、実際には描画コードに属しています。

主な例外は、テクスチャや VBO のように、一度だけ初期化される OpenGL オブジェクトです。

于 2013-02-06T22:57:07.077 に答える