2016-04-14 63 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