2016-04-14 150 views
1

所以我有一個3D的OpenGL應用程序,我想要顯示一個2D HUD,我理解了很多谷歌搜索後如何做到這一點的基本概念,但我沒有嘗試讓它顯示出來。去在許多其他的例子後,我當前的代碼是這樣的:OpenGL 2D HUD沒有顯示

// HUD /////////////////////////////////// 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0, (GLdouble)WIDTH, (GLdouble)HEIGHT, 0, -1, 1); 
    glDisable(GL_DEPTH_TEST); 
    glDisable(GL_CULL_FACE); 

    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); 
    glDepthMask(GL_TRUE); 

眼下沒有什麼視覺上的變化,我可以得到整個清屏的顏色但即使如此,我似乎無法畫上一個四。

編輯:

glDisable(GL_CULL_FACE); 
    glDisable(GL_DEPTH_TEST); 
    glDepthMask(GL_FALSE); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0, WIDTH, HEIGHT, 0, -1, 1); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glClear(GL_DEPTH_BUFFER_BIT); 

    glColor3f(1, 1, 1); 
    glPushMatrix(); 
    glBegin(GL_QUADS); 
    glVertex3f(-10.0f, 10.0f, 0.0f); 
    glVertex3f(-10.0f, -10.0f, 0.0f); 
    glVertex3f(10.0f, -10.0f, 0.0f); 
    glVertex3f(10.0f, 10.0f, 0.0f); 
    glEnd(); 
    glPopMatrix(); 

    glEnable(GL_CULL_FACE); 
    glEnable(GL_DEPTH_TEST); 
    glDepthMask(GL_TRUE); 

編輯2:空中包廂CODE

glDisable(GL_CULL_FACE); 
    glDepthFunc(GL_LEQUAL); // Change depth function so depth test passes when values are equal to depth buffer's content 
    skyShader.Bind(); 
    view = glm::mat4(glm::mat3(camera.GetViewProjection())); // Remove any translation component of the view matrix 
    glUniformMatrix4fv(glGetUniformLocation(skyShader.getProg(), "view"), 1, GL_FALSE, glm::value_ptr(view)); 
    glUniformMatrix4fv(glGetUniformLocation(skyShader.getProg(), "projection"), 1, GL_FALSE, glm::value_ptr(projection)); 
    // SKYBOX CUBE ///////////////////////////////// 
    glBindVertexArray(skyboxVAO); 
    glActiveTexture(GL_TEXTURE0); 
    glUniform1i(glGetUniformLocation(skyShader.getProg(), "skybox"), 0); 
    glBindTexture(GL_TEXTURE_CUBE_MAP, skyboxTexture); 
    glDrawArrays(GL_TRIANGLES, 0, 36); 
    glBindVertexArray(0); 
    glDepthFunc(GL_LESS); // Set depth function back to default 
+1

您正在圖像的左上角繪製5個像素,其他3/4的四邊形都在視錐外。 – derhass

+0

@derhass也許我只是在愚蠢,但我沒有遵循,我已經改變了頂點值,但仍然沒有看到任何東西。 – thesyncer

+0

改成了什麼? – derhass

回答

3

我不知道什麼HEIGHTWIDTH被設置爲,所以我只用100兩。當我運行你發佈的代碼時,我可以在屏幕的左上角看到你的四邊形。

我推薦的是直到你掌握了正在發生的事情。

例如:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

glPushMatrix(); 
glBegin(GL_QUADS); 
glVertex3f(-0.5f, 0.5f, 0f); 
glVertex3f(-0.5f, -0.5f, 0f); 
glVertex3f(0.5f, -0.5f, 0f); 
glVertex3f(0.5f, 0.5f, 0f); 
glEnd(); 
glPopMatrix(); 

鑑於你GL狀態的其餘不變,這應該畫一個白色方形填充屏幕的50%,在中心位置:

default view matrix

這是因爲視圖默認爲glOrtho調用,如下所示:

glOrtho(-1f, 1f, -1f, 1f, -1f, 1f); 

現在讓我們將WIDTHHEIGHT設置爲10f。這是你的glOrtho電話是:

glOrtho(0f, 10f, 10f, 0f, -1f, 1f); 

這是獲取呈現:

modified view matrix

如果您HEIGHTWIDTH比較大,說800×600,是四會這麼小止跌甚至不會出現。


編輯:使用glPushMatrixglPopMatrix隔離修改模型 - 視圖與投影矩陣

閱讀您的編輯和評論,讓我補充一點,我相信,說明你想要的一些示例代碼後。它不處理深度緩衝,這可能是什麼原因造成你的問題,但我想保持它的簡單和建立在我面前:

int width = 500; // window width 
int height = 500; // window height 

// define our GL viewport 
glViewport(0, 0, width, height); 

// setup 3d projection 
glMatrixMode(GL_PROJECTION); 
glPushMatrix(); 
glLoadIdentity(); 
glPerspective(60f, width/height, 1f, 50f); 

// setup 3d modelview 
glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 
glLoadIdentity(); 

// move the camera to put the tetrahedron behind the UI element 
glRotatef(135f, 0f, 0f, 1f); 
glTranslatef(0f, 5f, -30f); 

// draw 3d object (tetrahedron) 
glBegin(GL_TRIANGLES); 
// triangle 1 
glColor3f(1f, 0f, 0f);   // red 
glVertex3f(0f, 10f, 0f);  // a 
glColor3f(1f, 1f, 0f);   // yellow 
glVertex3f(0f, -10f, -10f);  // b 
glColor3f(0f, 1f, 0f);   // green 
glVertex3f(-10f, -10f, 10f); // c 
// triangle 2 
glColor3f(1f, 0f, 0f);   // red 
glVertex3f(0f, 10f, 0f);  // a 
glColor3f(1f, 0f, 1f);   // purple 
glVertex3f(10f, -10f, 10f);  // d 
glColor3f(1f, 1f, 0f);   // yellow 
glVertex3f(0f, -10f, -10f);  // b 
// triangle 3 
glColor3f(1f, 0f, 0f);   // red 
glVertex3f(0f, 10f, 0f);  // a 
glColor3f(0f, 1f, 0f);   // green 
glVertex3f(-10f, -10f, 10f); // c 
glColor3f(1f, 0f, 1f);   // purple 
glVertex3f(10f, -10f, 10f);  // d 
// triangle 4 
glColor3f(1f, 1f, 0f);   // yellow 
glVertex3f(0f, -10f, -10f);  // b 
glColor3f(1f, 0f, 1f);   // purple 
glVertex3f(10f, -10f, 10f);  // d 
glColor3f(0f, 1f, 0f);   // green 
glVertex3f(-10f, -10f, 10f); // c 
glEnd(); 

// revert to original modelview matrix 
glPopMatrix(); 
// revert to original projection matrix 
glMatrixMode(GL_PROJECTION); 
glPopMatrix(); 

// setup 2d projection 
glMatrixMode(GL_PROJECTION); 
glPushMatrix(); 
glLoadIdentity(); 
glOrtho(0f, 1f, 1f, 0f, -1f, 1f); 

// setup 2d modelview 
glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 
glLoadIdentity(); 

// draw the 2d interface 
glBegin(GL_QUADS); 
glColor3f(0.5f, 0.5f, 0.5f); // grey 
glVertex3f(0.05f, 0.05f, 0f); // top-left 
glVertex3f(0.95f, 0.05f, 0f); // top-right 
glVertex3f(0.95f, 0.2f, 0f); // bottom-right 
glVertex3f(0.05f, 0.2f, 0f); // bottom-left 
glEnd(); 

// revert to original modelview matrix 
glPopMatrix(); 
// revert to original projection matrix 
glMatrixMode(GL_PROJECTION); 
glPopMatrix(); 

這使得如下:

interface over tetrahedron

你會發現,當我們設置ModelView矩陣,我們使用這種方法來定義視錐的2D界面:

glOrtho(0f, 1f, 1f, 0f, -1f, 1f); 

這將我們的視圖空間定義爲左上角爲0,0,右下角爲1,1。這使我們可以在屏幕上放置東西而不考慮視口大小。當我們繪製我們的2D界面時,我們只需提供0.0到1.0範圍內的值,並且它將適合視口。

重要: 你應該永遠記住,模型視圖和投影矩陣是堆棧。在對它們進行任何修改之前,請記住在堆棧上推新圖層,然後在完成時將其彈出。通過這樣做,您可以隔離您的更改。

+0

感謝您的深入響應,您幫助我更好地理解了一些問題。我仍然有問題,但我已經在編輯中更改了我的代碼,如果我將它定位到場景中的z位置,我已經能夠看到正在繪製的四邊形,它隱藏了我的3D對象,但我仍然可以看不見四方是自己的。我認爲我的天空盒代碼可能會導致深度問題,我也編輯過它。 – thesyncer

+0

你可以發佈你所看到的截圖嗎?這可能會幫助我更多地理解。 – Exide

+0

http://i.imgur.com/XaNWM24.jpg我的天空盒上。 http://i.imgur.com/Xm8WbH5.png旋轉透視與skybox註釋掉,這是一個平面四通過場景的中心。 – thesyncer