【问题标题】:OpenGL 2D HUD not showingOpenGL 2D HUD 未显示
【发布时间】:2016-04-17 06:49:41
【问题描述】:

所以我有一个 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:SKYBOX 代码

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

【问题讨论】:

  • 您只在图像的左上角绘制了 5 个像素。四边形的其他 3/4 位于截锥体之外。
  • @derhass 也许我只是很愚蠢,但我没有遵循,我更改了顶点值但仍然看不到任何东西。
  • @derhass 我已将它们更改为仅正值,增加了数字并尝试了 2d 顶点。
  • 请注意,在您调用它时,您的 OpenGL 上下文处于什么状态是完全不清楚的。有 种不同的状态可能导致四边形不被绘制。
  • @derhass 我很确定这只是我在某处俯瞰的状态,但从未做过 2D 而非 3D,所以我可能遗漏了一些明显的东西。

标签: c++ opengl


【解决方案1】:

我不确定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% 屏幕的白色四边形,位于中心:

这是因为视图默认为 glOrtho 调用,如下所示:

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

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

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

这是渲染的内容:

如果您的 HEIGHTWIDTH 更大,例如 800x600,则该四边形会非常小,甚至不会出现。


编辑:使用glPushMatrixglPopMatrix 隔离对模型视图和投影矩阵的修改

阅读您的编辑和 cmets 后,让我添加一些示例代码,我相信这些代码可以说明您想要什么。它不处理深度缓冲区,这可能是导致您出现问题的原因,但我想保持简单并建立在我之前的基础上:

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);

这将我们的视图空间定义为左上角为 0,0,右下角为 1,1。这允许我们在屏幕上放置东西而不考虑视口大小。当我们绘制 2d 界面时,我们只需提供 0.0 到 1.0 范围内的值,它将适合视口。

重要: 您应该始终记住模型视图和投影矩阵是堆栈。在对它们进行任何修改之前,请记住在堆栈上推送一个新层,然后在完成后将其弹出。通过这样做,您可以隔离您的更改。

【讨论】:

  • 感谢您的深入回复,您帮助我更好地理解了一些观点。但是我仍然遇到问题,我已经在编辑中更改了我的代码,如果我将它的 z 位置定位到场景中,我已经能够看到正在绘制一个四边形,它隐藏了我的 3D 对象,但我仍然可以看不到它自己的四边形。我认为我的天空盒代码可能会导致深度问题,我也对其进行了编辑。
  • 你能张贴你看到的截图吗?这可能有助于我了解更多。
  • i.imgur.com/XaNWM24.jpg 开启我的天空盒。 i.imgur.com/Xm8WbH5.png 带有天空盒的旋转透视图已被注释掉,这是一个穿过场景中心的平面四边形。
  • 如果对我的回答有帮助,请告诉我。如果没有,我将探索深度缓冲区如何影响事物。
  • 我发现我的天空盒导致没有绘制任何内容的原因是我的着色器有问题。我现在解决了这个问题,您的示例代码非常有用,我现在正在使用它,但我遇到的最后一个问题是四边形仍在 3D 空间中绘制,即如果我移动我的相机,它在 3D 场景中并停留在尽管使用了 glOrtho,但相对于其他对象的空间。在这张图片中,您可以看到四边形的位置,在红色环上i.imgur.com/PNeyoi1.jpg
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-31
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
相关资源
最近更新 更多