2010-11-25 210 views
9

我有一個移動的3D場景設置,並且我想製作一個始終位於頂部的固定2D圖形覆蓋圖,當我嘗試製作2D圖形時,我什麼都看不到。當我調用:glMatrixMode(GL_PROJECTION);我的3D場景消失了,我留下了一個空白的窗口...Opengl在3D場景上繪製2D覆蓋圖問題

這裏是我使用的覆蓋碼

編輯:更新的代碼

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluOrtho2D(-100, 100, -100, 100); 
glDisable(GL_DEPTH_TEST); 
glDisable(GL_CULL_FACE); 
glDisable(GL_TEXTURE_2D); 
glDisable(GL_LIGHTING); 
glColor3f(1, 1, 1); 
glPushMatrix(); 
glBegin(GL_QUADS); 
glVertex3f(-5.0f, 5.0f, 0.0f); 
glVertex3f(-5.0f, -5.0f, 0.0f); 
glVertex3f(5.0f, -5.0f, 0.0f); 
glVertex3f(5.0f, 5.0f, 0.0f); 
glEnd(); 
glPopMatrix(); 
glEnable(GL_DEPTH_TEST); 
glutSwapBuffers(); 

回答

4

您必須繪製以另一種順序四倍。默認情況下,OpenGL使用逆時針前面多邊形。這意味着你看不到你的多邊形,因爲你只能看到它的背面。你可以看看glFrontFace

編輯:

而且,如果不工作,你可以嘗試禁用以下狀態:

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluOrtho2D(-100, 100, -100, 100); 
glDisable(GL_DEPTH_TEST); 
glDisable(GL_CULL_FACE); 
glDisable(GL_BLENDING); 
glDisable(GL_TEXTURE_2D); 
glDisable(GL_LIGHTING); 

您可能要爲了使用glPushAttribglPopAttrib不要亂你的狀態。

+1

或`glDisable(GL_CULL_FACE)`。 – JWWalker 2010-11-25 19:16:51

+0

改變了glVertex3f的順序直到遇到同樣的問題,我認爲這是別的。 – ajoe 2010-11-25 19:21:30

1

另外,我還爲這些東西使用了一個單獨的FBO。通常疊加層不必一直重畫,所以根據需要將其渲染給FBO,並將其渲染爲每幀全屏四元組。它浪費了一些填充量,但總的來說,我發現它通常更快,並使代碼更清潔。

4

嗯...基於你發佈的代碼片段,我相信你的場景會因爲你的矩陣做什麼而消失 - 看起來有點混亂。該方法應該是這樣的:

  • 清潔屏幕
  • 3D:
    • 使照明,Z測試等
    • 設置有源矩陣模式,以投影
    • 負載身份並建立透視投影
    • 將主動矩陣模式設置回模型視圖
    • 繪製所有內容3D
  • 2D:
    • 禁用照明,Z測試等
    • 設置有源矩陣模式,以投影
    • 負載身份並建立一個ortogonal投影
    • 設置有源矩陣模式返回到模型視圖
    • 繪製一切2D
  • 交換緩衝區

另外,如果你想讓你的生活變得更簡單,考慮切換到着色器(以及一般的現代OpenGL版本)。

1

確保您的幾何體(特別是您的幾何體的z座標,根據您的2d UI)大於近平面(z軸上近平面的後面),否則,發生任何渲染在近平面的前方不會被看到。我假設你已經在代碼的其他地方定義了你的視域(這是近平面定義的地方)。

如果近平面0.01F,那麼你的頂點定義可能是

glVertex3f(-5.0f, 5.0f, -0.02f); 
glVertex3f(-5.0f, -5.0f, -0.02f); 
glVertex3f(5.0f, -5.0f, -0.02f); 
glVertex3f(5.0f, 5.0f, -0.02f); 

相信在MatrixMode(GL_MODELVIEW)你總是在尋找到-Z軸。 我希望這可以幫助。

我可能是錯的,但我認爲DEPTH_TEST是指z緩衝你的最終渲染對象,我不認爲它會禁用近平面值。

2
glDisable(GL_DEPTH_TEST); 
glDisable(GL_CULL_FACE); 
glDisable(GL_TEXTURE_2D); 
glDisable(GL_LIGHTING); 

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluOrtho2D(-100, 100, -100, 100); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glColor3f(1, 1, 1); 
glBegin(GL_QUADS); 
    glVertex3f(20.0f, 20.0f, 0.0f); 
    glVertex3f(20.0f, -20.0f, 0.0f); 
    glVertex3f(-20.0f, -20.0f, 0.0f); 
    glVertex3f(-20.0f, 20.0f, 0.0f); 
glEnd(); 
/// Now swap buffers 
0
' glGetBooleanv(GL_BLEND,  &m_origin_blend); 
glGetBooleanv(GL_DEPTH_TEST,&m_origin_depth); 
glGetBooleanv(GL_CULL_FACE, &m_origin_cull); 

setAlphaBlending(true); 
setDepthTest(false); 
setCullFace(false); //by stone 

//ur draw core() 

setAlphaBlending(m_origin_blend>0?true:false); 
setDepthTest(m_origin_depth>0?true:false); 
setCullFace(m_origin_cull>0?true:false); //by stone 
'