我有一个移动的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();
答案 0 :(得分:5)
嗯......基于你发布的代码片段,我相信你的场景会因为你正在用你的矩阵做什么而消失 - 看起来有点混乱。方法应如下所示:
另外,如果你想让自己的生活变得更轻松,可以考虑切换到着色器(以及一般的现代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);
您可能需要使用glPushAttrib
和glPopAttrib
,以免弄乱您的州。
答案 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
'