所以我有一个 3D 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:天空盒代码
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
最佳答案
我不确定 HEIGHT
和 WIDTH
设置的是什么,所以我只是将两者都设置为 100。当我运行您发布的代码时,我可以在屏幕的左上角看到您的四边形。
我建议的是简化您的 HUD 代码,直到您了解正在发生的事情。
例如:
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%,位于中心:
这是因为 View 默认调用如下所示的 glOrtho
:
glOrtho(-1f, 1f, -1f, 1f, -1f, 1f);
现在让我们将 WIDTH
和 HEIGHT
设置为 10f。这就是您的 glOrtho
调用:
glOrtho(0f, 10f, 10f, 0f, -1f, 1f);
这是渲染的内容:
如果您的 HEIGHT
和 WIDTH
更大,比如 800x600,那么四边形会很小,甚至不会出现。
编辑:使用 glPushMatrix
和 glPopMatrix
隔离对模型 View 和投影矩阵的修改
阅读您的编辑和评论后,让我添加一些示例代码,我相信它们可以说明您的需求。它不处理深度缓冲区,这可能是导致您出现问题的原因,但我想保持简单并建立在我之前的基础上:
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();
这会呈现以下内容:
当我们为 2d 界面设置 ModelView
矩阵时,您会注意到我们使用它来定义视锥体:
glOrtho(0f, 1f, 1f, 0f, -1f, 1f);
这将我们的 View 空间定义为左上角为 0,0,右下角为 1,1。这使我们可以在不考虑视口(viewport)大小的情况下将内容放置在屏幕上。当我们绘制 2d 界面时,我们只需提供 0.0 到 1.0 范围内的值,它就会适合视口(viewport)。
重要: 您应该永远记住,模型- View 和投影矩阵是堆栈。在对它们进行任何修改之前,请记住将一个新层压入堆栈,然后在完成后将其弹出。通过这样做,您可以隔离您的更改。
关于c++ - OpenGL 2D HUD 不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36631321/