Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL 2D HUD未显示_C++_Opengl - Fatal编程技术网

C++ OpenGL 2D HUD未显示

C++ OpenGL 2D HUD未显示,c++,opengl,C++,Opengl,所以我有一个3D openGL应用程序,我想显示一个2D HUD,我理解了如何在大量的搜索之后如何做这个基本概念,但我没有任何尝试使它出现。在阅读了许多其他示例后,我当前的代码如下: // HUD /////////////////////////////////// glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glMatrixMode(GL_PROJECTION); glLoadIdentity();

所以我有一个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);
现在视觉上没有任何变化,我可以让整个屏幕清晰地显示出一种颜色,但即使这样,我似乎也无法在上面画一个四边形

编辑:

编辑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

我不确定
高度
宽度
设置为多少,所以我两个都用了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);
现在让我们将
宽度
高度
设置为10f。这就是您的
glOrtho
调用的内容:

glOrtho(0f, 10f, 10f, 0f, -1f, 1f);
这就是渲染的内容:

如果你的
高度
宽度
更大,比如说800x600,那么这个四元组将非常小,甚至不会出现


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

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

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();
这将导致以下情况:

您会注意到,当我们为二维界面设置
ModelView
矩阵时,我们使用它来定义视锥体:

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

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

您只在图像的左上角绘制了5个像素,四元体的其他3/4在平截头体之外。@derhass也许我只是很愚蠢,但我不明白,我更改了顶点值,但仍然看不到任何东西。@derhass我只将它们更改为正值,增加了数字,还尝试了2d顶点。请注意,在调用此函数时,完全不清楚OpenGL上下文处于什么状态。有很多不同的状态可能会导致无法绘制四边形。@derhass我很确定这只是一个我在某处忽略的状态,虽然我从未做过2D而不是3D,但我可能遗漏了一些引人注目的东西。感谢您的深入回复,您帮助我更好地理解了一些要点。我仍然有问题,但是,我在编辑中更改了我的代码,我能够看到有一个四边形正在绘制,如果我将它的z位置定位到场景中,它会隐藏我的3D对象,但我仍然看不到四边形它的自身。我想我的skybox代码可能引起了深度问题,我也对它进行了编辑。你能发布一个你看到的屏幕截图吗?这可能会帮助我理解更多。打开我的skybox。用skybox旋转的透视图注释掉了,这是一个穿过场景中心的平面四边形。请告诉我对我的答案的编辑是否有帮助。如果没有,我将探索深度缓冲区是如何影响事情的。我发现我的skybox在没有绘制任何内容的情况下导致问题的原因是我的着色器的问题。我现在解决了这个问题,您的示例代码非常有用,我现在正在使用它,但最后一个问题是,四边形仍在三维空间中绘制,即,如果我移动相机,它将位于三维场景中,并相对于其他对象停留在空间中,尽管使用了glOrtho。在这张图片中,你可以看到四元的位置,在红环上
glOrtho(0f, 1f, 1f, 0f, -1f, 1f);