2010-11-26 6 views
5

「トップ」または3D世界でレンダリングされた2Dインターフェイスを作成する必要があるプロジェクトで作業しています。他のいくつかのフォーラムでは、仕事のために "GluOrtho2D()"を使用し、完了したらGluPerspective()に戻ることができます。唯一のことは、私が書いた私のテストコードは2Dのクワッドではなく、3Dの世界を表示するということです。ただし、3Dレンダリングコードを無効にすると、クワッドは想定されていた場所に表示されます。 私はコードを以下のように記述したopenGL only文にトリムダウンしました。コードはPygletライブラリを使ってPythonで書かれています。3D OpenGLワールドで2Dインターフェイスを作成する際の問題


シーンの初期化コード:

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) 

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

答えて

3

に見えます。覚えておくのが最も簡単な方法は、投影行列を変更し、GL_MODELVIEWに切り替えてglLoadIdentity()(実際に古いものを保持しない場合)を呼び出すたびに呼び出すことです。

+0

完璧!それはそれを修正した。どうもありがとうございました! – Bartvbl

1

私は2Dレンダリングのために、次の行列を使用する:あなたはGL_MODELVIEWに切り替えた後glLoadIdentity()を呼び出さないよう

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); 
2

多くの人がglViewportなどの使い方が間違っています。彼らはいつもそれを間違った形のコールバックに置きます。

これらの設定が必要になる直前に、レンダリング機能で常に完全な設定を行います。あなたのコードは(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は状態マシンです。不確定な状態の変化が起きないことを証明できない限り、特定のジオメトリをレンダリングする前に、必要な状態を常に再設定します。

関連する問題