2010-11-26 100 views
5

我正在開發一個項目,該項目需要我創建一個呈現「頂部」或3D世界的2D界面。在其他一些論壇上,我讀到您可以使用「GluOrtho2D()」作爲工作,並在完成後切換回GluPerspective()。唯一的問題是,我爲它編寫的測試代碼僅顯示3D世界,而不是2D四邊形。但是,當我禁用3D渲染代碼時,四邊形會出現在應該出現的位置。 我調整了代碼以打開僅用於GL的語句,我在下面寫下了這些語句。代碼使用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()的調用創建三維場景,並且在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()。最簡單的記住方法是每次更改投影矩陣時調用它,切換到GL_MODELVIEW並調用glLoadIdentity()(除非您真的想保留舊的)。

+0

完美!這解決了它。非常感謝你! – Bartvbl 2010-11-26 23:46:20

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); 
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是一個狀態機。除非您可以證明沒有未確定的狀態變化發生,否則您在渲染某個幾何體之前總是重新設置所需的所有狀態。