Opengl drawing a 2d overlay on a 3d scene problem

20,619

Solution 1

You must draw your quad in the other order. By default, OpenGL use counterclockwise front facing polygons. That means that you don't see your polygon because you see only its back face.

You might take a look at glFrontFace.

EDIT:

Also, if that doesn't work, you could try to disable the following states:

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

You might want use glPushAttrib and glPopAttrib in order not to mess your state.

Solution 2

Hmm... Basing on the fragment of code you posted, I believe that your scene disappears because of what you're doing with your matrices - looks a bit chaotic to me. The approach should look like this:

  • clean the screen
  • 3D:
    • enable lighting, z-test, etc
    • set active matrix mode to projection
    • load identity and establish a perspective projection
    • set active matrix mode back to modelview
    • draw everything 3D
  • 2D:
    • disable lighting, z-test, etc
    • set active matrix mode to projection
    • load identity and establish an ortogonal projection
    • set active matrix mode back to modelview
    • draw everything 2D
  • swap buffers

Also, consider switching to shaders (and to a modern OpenGL version in general) if you want to make your life even easier :).

Solution 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

Solution 4

Make sure your geometry ( specifically the z coordinates of your geometry, in terms of your 2d UI ) is greater than the near plane ( behind the near plane on the z-axis ), otherwise, any rendering which takes place in front of the near-plane will not be seen. I'm assuming you have defined your view frustum somewhere else in the code ( this is where the near-plane is defined ).

If the near-plane is 0.01f, then your vertex definitions could be

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

I believe in the MatrixMode( GL_MODELVIEW ) you are always looking into the -Z Axis. I hope this helps.

I may be wrong but i think the DEPTH_TEST refers to the z-buffering of your final rendered object, i don't think it disables the near-plane value.

Solution 5

In addition, I also use a separate FBO for these kind of things. Usually the overlay doesn't have to be redrawn all the time, so render it on demand to a FBO and just render it as a fullscreen quad each frame. It wastes some fillrate but in general I find it is usually faster anyway and makes the code so much cleaner.

Share:
20,619
ajoe
Author by

ajoe

Updated on July 09, 2022

Comments

  • ajoe
    ajoe almost 2 years

    I have a moving 3d scene set up, and I want to make a stationary 2d GUI overlay that is always on top, when I try making 2d shapes I don't see anything. When I call: glMatrixMode(GL_PROJECTION); my 3d scene disappears and I'm left with a blank window...

    here is the code I'm using for the overlay

    EDIT: updated code

        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();
    
  • JWWalker
    JWWalker over 13 years
    Or glDisable( GL_CULL_FACE ).
  • ajoe
    ajoe over 13 years
    changed the order of the glVertex3f's till having the same problem, I think it's something else.
  • ext
    ext over 13 years
    After setting glMatrixMode(GL_PROJECTION) set it back to glMatrixMode(GL_MODELVIEW), and especially after your 2D UI code is finished.
  • Kos
    Kos over 13 years
    Sounds like fun, but rendering to your specific FBO instead of the default FBO needs, well, exactly the same rendering code :) plus some more for handling the FBO itself. Where's the gain here?
  • ext
    ext over 13 years
    IMO: speed, cleaner code, easier debugging. It does not solve his problem, and yes the same rendering code is needed. But it is separated into two distinct phases. And as you said in your reply, he should use shaders, and combine FBO and shaders allows you to have much more fun doing effects when rendering the screensized quad.