Opengl在3d场景问题上绘制2d覆盖图

我有一个移动的3D场景设置,我想制作一个永远在顶部的固定2d GUI覆盖,当我尝试制作2d形状时,我什么也看不到。 当我调用:glMatrixMode(GL_PROJECTION); 我的3D场景消失了,我留下了一个空白的窗口……

这是我用于叠加层的代码

编辑:更新的代码

glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-100, 100, -100, 100); glDisable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); glDisable(GL_TEXTURE_2D); glDisable(GL_LIGHTING); 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); glutSwapBuffers(); 

您必须以其他顺序绘制四边形。 默认情况下,OpenGL使用逆时针前面的多边形。 这意味着您没有看到多边形,因为您只看到它的背面。

你可以看一下glFrontFace 。

编辑:

此外,如果这不起作用,您可以尝试禁用以下状态:

 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-100, 100, -100, 100); glDisable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); glDisable(GL_BLENDING); glDisable(GL_TEXTURE_2D); glDisable(GL_LIGHTING); 

你可能想要使用glPushAttribglPopAttrib ,以免弄乱你的状态。

嗯……基于你发布的代码片段,我相信你的场景会因你对你的矩阵所做的事情而消失 – 看起来对我来说有点混乱。 方法应如下所示:

  • 清洁屏幕
  • 3D:
    • 启用照明,z测试等
    • 将有源矩阵模式设置为投影
    • 加载标识并建立透视投影
    • 将活动矩阵模式设置回modelview
    • 画出一切3D
  • 2D:
    • 禁用照明,z测试等
    • 将有源矩阵模式设置为投影
    • 加载标识并建立正交投影
    • 将活动矩阵模式设置回modelview
    • 绘制所有2D
  • 交换缓冲区

另外,如果你想让你的生活更轻松,可以考虑切换到着色器(以及一般的现代OpenGL版本)。

 glDisable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); glDisable(GL_TEXTURE_2D); glDisable(GL_LIGHTING); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-100, 100, -100, 100); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glColor3f(1, 1, 1); glBegin(GL_QUADS); glVertex3f(20.0f, 20.0f, 0.0f); glVertex3f(20.0f, -20.0f, 0.0f); glVertex3f(-20.0f, -20.0f, 0.0f); glVertex3f(-20.0f, 20.0f, 0.0f); glEnd(); /// Now swap buffers 

另外,我还使用单独的FBO来做这些事情。 通常不必一直重新绘制叠加层,因此可以根据需要将其渲染到FBO,并将其渲染为每帧的全屏四边形。 它浪费了一些填充,但总的来说,我发现它通常更快,并使代码更清洁。

确保几何体(特别是几何体的z坐标,就第二个UI而言)大于近平面(在z轴上的近平面后面),否则,任何渲染都发生在近端前面 – 飞机将不会被看到。 我假设您已经在代码中的其他位置定义了视锥(这是定义近平面的位置)。

如果近平面是0.01f,那么你的顶点定义可能是

 glVertex3f(-5.0f, 5.0f, -0.02f); glVertex3f(-5.0f, -5.0f, -0.02f); glVertex3f(5.0f, -5.0f, -0.02f); glVertex3f(5.0f, 5.0f, -0.02f); 

我相信MatrixMode( GL_MODELVIEW )你总是在研究-Z Axis。 我希望这有帮助。

我可能错了,但我认为DEPTH_TEST是指最终渲染对象的z缓冲,我认为它不会禁用近平面值。

 ' glGetBooleanv(GL_BLEND, &m_origin_blend); glGetBooleanv(GL_DEPTH_TEST,&m_origin_depth); glGetBooleanv(GL_CULL_FACE, &m_origin_cull); setAlphaBlending(true); setDepthTest(false); setCullFace(false); //by stone //ur draw core() setAlphaBlending(m_origin_blend>0?true:false); setDepthTest(m_origin_depth>0?true:false); setCullFace(m_origin_cull>0?true:false); //by stone '