C Opengl在3d场景问题上绘制2d覆盖图
我设置了一个移动的3d场景,我想制作一个固定的2d GUI覆盖,它总是在顶部,当我尝试制作2d形状时,我什么都看不到。当我调用时:glMatrixMode(GL_投影);我的3d场景消失了,我只剩下一个空白的窗口 下面是我用于覆盖的代码 编辑:更新代码C Opengl在3d场景问题上绘制2d覆盖图,c,opengl,glut,C,Opengl,Glut,我设置了一个移动的3d场景,我想制作一个固定的2d GUI覆盖,它总是在顶部,当我尝试制作2d形状时,我什么都看不到。当我调用时:glMatrixMode(GL_投影);我的3d场景消失了,我只剩下一个空白的窗口 下面是我用于覆盖的代码 编辑:更新代码 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-100, 100, -100
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使用逆时针正面多边形。这意味着你看不到多边形,因为你只看到它的背面 你可以看看 编辑: 此外,如果不起作用,您可以尝试禁用以下状态:
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
和glpopatrib
,以免扰乱您的状态。此外,我还使用单独的FBO来处理这类事情。通常,覆盖不必一直重画,因此根据需要将其渲染到FBO,并在每帧将其渲染为全屏四边形。它浪费了一些填充率,但总的来说,我发现它通常更快,并且使代码更干净。嗯。。。根据你发布的代码片段,我相信你的场景消失了,因为你在用矩阵做什么-在我看来有点混乱。方法应如下所示:
- 清洁屏幕
- 3D:
- 启用照明、z测试等
- 将活动矩阵模式设置为“投影”
- 加载标识并建立透视投影
- 将活动矩阵模式设置回modelview
- 把所有东西都画成3D
- 2D:
- 禁用照明、z测试等
- 将活动矩阵模式设置为“投影”
- 加载标识并建立正交投影
- 将活动矩阵模式设置回modelview
- 把所有东西都画成2D
- 交换缓冲区
也可以考虑切换到着色器(和一般的现代OpenGL版本),如果你想让你的生活更容易:)
确保你的几何学(特别是你的几何学的Z坐标,就你的2D 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\u MODELVIEW)
您总是在查看-Z轴。
我希望这有帮助
我可能错了,但我认为深度测试是指最终渲染对象的z缓冲,我不认为它禁用了近平面值。或
glDisable(GL\u CULL\u FACE)
。更改了glVertex3f的顺序,直到出现同样的问题,我认为是其他问题。设置glMatrixMode(GL\u投影)后将其设置回glMatrixMode(GL_MODELVIEW),尤其是在2D UI代码完成后。听起来很有趣,但渲染到特定FBO而不是默认FBO需要的,完全相同的渲染代码:)以及更多用于处理FBO本身的代码。IMO:速度快,代码更简洁,调试更容易。这并不能解决他的问题,是的,需要相同的渲染代码。但它分为两个不同的阶段。正如您在回复中所说,他应该使用着色器,并且将FBO和着色器结合使用,可以让您在渲染屏幕大小的四边形时获得更有趣的效果。
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
' 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
'