c++ - OpenGL 2D HUD 不显示

标签 c++ opengl

所以我有一个 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

最佳答案

我不确定 HEIGHTWIDTH 设置的是什么,所以我只是将两者都设置为 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%,位于中心:

default view matrix

这是因为 View 默认调用如下所示的 glOrtho:

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

现在让我们将 WIDTHHEIGHT 设置为 10f。这就是您的 glOrtho 调用:

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

这是渲染的内容:

modified view matrix

如果您的 HEIGHTWIDTH 更大,比如 800x600,那么四边形会很小,甚至不会出现。


编辑:使用 glPushMatrixglPopMatrix 隔离对模型 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();

这会呈现以下内容:

interface over tetrahedron

当我们为 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/

相关文章:

c++ - 如何知道复制构造函数被调用?

c++ - QSqlDatabasePrivate::addDatabase:重复的连接名称 'qt_sql_default_connection'

std::find_if 中的 C++ lambda 表达式?

c++ - 无法为 Oculus Rift 创建 OpenGL 交换纹理

java - OpenGL绘制数千个二维圆

c++ - Glew - 与 GLFW 配对时 gl- 函数符号的链接错误

Python Web 浏览器引擎

opengl - 注入(inject)帧缓冲区

c++ - GL_DEPTH_TEST 在 OpenGL 3.3 中不起作用

c++ - OpenGL:缓冲到 VBO 后我还需要一个顶点数组吗?