Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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在3d场景问题上绘制2d覆盖图_C_Opengl_Glut - Fatal编程技术网

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

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

我设置了一个移动的3d场景,我想制作一个固定的2d GUI覆盖,它总是在顶部,当我尝试制作2d形状时,我什么都看不到。当我调用时:glMatrixMode(GL_投影);我的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使用逆时针正面多边形。这意味着你看不到多边形,因为你只看到它的背面

你可以看看

编辑:

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

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
'