2010-11-25 205 views
9

我有一个移动的3D场景设置,并且我想制作一个始终位于顶部的固定2D图形覆盖图,当我尝试制作2D图形时,我什么都看不到。当我调用:glMatrixMode(GL_PROJECTION);我的3D场景消失了,我留下了一个空白的窗口...Opengl在3D场景上绘制2D覆盖图问题

这里是我使用的覆盖码

编辑:更新的代码

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(); 

回答

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不要乱你的状态。

+1

或`glDisable(GL_CULL_FACE)`。 – JWWalker 2010-11-25 19:16:51

+0

改变了glVertex3f的顺序直到遇到同样的问题,我认为这是别的。 – ajoe 2010-11-25 19:21:30

1

另外,我还为这些东西使用了一个单独的FBO。通常叠加层不必一直重画,所以根据需要将其渲染给FBO,并将其渲染为每帧全屏四元组。它浪费了一些填充量,但总的来说,我发现它通常更快,并使代码更清洁。

4

嗯...基于你发布的代码片段,我相信你的场景会因为你的矩阵做什么而消失 - 看起来有点混乱。该方法应该是这样的:

  • 清洁屏幕
  • 3D:
    • 使照明,Z测试等
    • 设置有源矩阵模式,以投影
    • 负载身份并建立透视投影
    • 将主动矩阵模式设置回模型视图
    • 绘制所有内容3D
  • 2D:
    • 禁用照明,Z测试等
    • 设置有源矩阵模式,以投影
    • 负载身份并建立一个ortogonal投影
    • 设置有源矩阵模式返回到模型视图
    • 绘制一切2D
  • 交换缓冲区

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

1

确保您的几何体(特别是您的几何体的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_MODELVIEW)你总是在寻找到-Z轴。 我希望这可以帮助。

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

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