6

「上に」レンダリングされた 2D インターフェイスまたは 3D ワールドを作成する必要があるプロジェクトに取り組んでいます。他のいくつかのフォーラムで、仕事に「GluOrtho2D()」を使用し、完了したら GluPerspective() に戻すことができると読みました。唯一のことは、私が書いたテスト コードは、2D クワッドではなく、3D ワールドのみを表示するということです。ただし、3D レンダリング コードを無効にすると、クワッドが本来あるべき場所に表示されます。コードを openGL のみのステートメントに切り詰め、以下に書き留めました。コードは、Pyglet ライブラリを使用して Python で記述されています。


シーンの初期化コード:

glViewport(0, 0, width, height)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60.0, float(width)/height, .1, 10000.)
glMatrixMode(GL_MODELVIEW)
glClearDepth(1.0)
glShadeModel(GL_FLAT)
glEnable(GL_DEPTH_TEST)
glDepthFunc(GL_LEQUAL) 
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)

フレーム レンダリング コード。builder.buildMap() の呼び出しによって 3D シーンが作成され、glBegin-glEnd のペアによって 2D クワッドが描画されます。

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)
stage.set3DMode(window.width, window.height)
builder.buildMap()
stage.set2DMode(window.width, window.height)
glBegin (GL_QUADS)
glVertex2i(0, 0)
glVertex2i(0, 200)
glVertex2i(200, 200)
glVertex2i(200, 0) 
glEnd()

stage.set3DMode 関数:

glDisable(GL_DEPTH_TEST) 
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluOrtho2D(0, width, 0, height)
glMatrixMode(GL_MODELVIEW)

および stage.set3DMode 関数:

glEnable(GL_DEPTH_TEST) 
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60.0, float(width)/float(height), .1, 10000.)
glMatrixMode(GL_MODELVIEW)

誰かが私の間違いを指摘してくれることを本当に願っています!そして、私を助けてくれてありがとう:)

4

3 に答える 3

4

glLoadIdentity()GL_MODELVIEWに切り替えてから呼び出していないようです。覚えておく最も簡単な方法は、射影行列を変更するたびに呼び出し、GL_MODELVIEW に切り替えて呼び出すglLoadIdentity()ことです (本当に古いものを保持したい場合を除きます)。

于 2010-11-26T23:38:10.763 に答える
2

多くの人がglViewportなどの使い方を間違えています。彼らは常にそれをreshapeコールバックに配置しますが、これは単に間違っています。

これらの設定が必要になる直前に、レンダリング機能を常に完全に設定します。したがって、コードは(pesudocode)である必要があります。

render_scene():
    // first clear the whole window
    glViewport(0, 0, window.width, window.height)
    glClearDepth(1.0)
    glClearColor(1., 1., 1., 1.);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)

    glViewport(3Dstuff.x, 3Dstuff.y, 3Dstuff.w, 3Dstuff.h)
    // maybe also set scissor to clip
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(60.0, float(width)/height, .1, 10000.)
    glMatrixMode(GL_MODELVIEW)
    setup3DstuffModelview()
    glDepthFunc(...)
    glEnable(GL_DEPTH_TEST)
    // other state stuff
    render3Dstuff()

    // now the 2D stuff
    glViewport(2Dstuff.x, 2Dstuff.y, 2Dstuff.w, 2Dstuff.h)
    // clear depth and stencil -- if you need parts of the 3D depth / stencil
    // for some algorithm retain it or save and restore by FBO renderbuffers or
    // glReadPixels, glDrawPixels
    glClearDepth(1.0)
    glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)

    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glOrtho(...)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    setup2DstuffModelview()
    glDepthFunc(...)
    glDisable(GL_DEPTH_TEST)
    // other state stuff
    render2Dstuff()

    // repeat for all the layers you need

これは非常に重要です。OpenGLはステートマシンです。未確定の状態変化が発生しないことを証明できない限り、特定のジオメトリをレンダリングする前に、必要なすべての状態を常に再/設定します。

于 2010-11-30T12:45:13.640 に答える
1

2D レンダリングには次のマトリックスを使用します。

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, w, h, 0, 0, 1);
glViewport(0, 0, w, h);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.375f, 0.375f, 0);
于 2010-11-26T23:18:13.807 に答える