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

时间:2010-11-25 19:07:27

标签: c opengl glut

我有一个移动的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();

6 个答案:

答案 0 :(得分:5)

嗯......基于你发布的代码片段,我相信你的场景会因为你正在用你的矩阵做什么而消失 - 看起来有点混乱。方法应如下所示:

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

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

答案 1 :(得分:4)

您必须以其他顺序绘制四边形。默认情况下,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,以免弄乱您的州。

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

确保几何体(特别是几何体的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轴。 我希望这会有所帮助。

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

答案 5 :(得分:0)

'    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
'