This is from an old OpenGL-based game engine I was trying to write about seven years ago written in C++ so bare with me as I try to explain how I handled 3D world and 2D GUI rendering operations within it. I used four primary methods within my OpenGL renderer class (OGLRender) of which are:
- ready3D() for preparing OpenGL to render the 3D world scene.
- ready2D() for preparing OpenGL to render the 2D GUI.
- render3D() for the actual 3D world scene drawing.
- render2D() for the actual 2D GUI drawing.
glViewport(0, 0, m_Setup.width, m_Setup.height);
gluPerspective(45, (float) m_Setup.width / m_Setup.height, 0.1, 5000.0);
gluOrtho2D(0.0f, m_Setup.width, m_Setup.height, 0.0f);
glTranslatef(0.375, 0.375, 0.0);
// ... draw 3D world scene here ...
// ... draw GUI here ...
And then in the main thread loop I would basically just call the methods in the following order:
gm_Render->render3D(); // draw 3D scene
gm_Render->render2D(); // draw GUI
SDL_GL_SwapBuffers(); // make drawn frame visible
So, what I am doing is I draw my 3D world scene first and then I draw my GUI last that way the GUI is always on top of the world scene. ready3D() method gets the 3D world projection ready for world scene drawing and ready2D() method gets the 2D ortho scene ready for GUI drawing. m_Setup.width and m_Setup.height are just the view port screen dimensions.
What is special about the ready2D() method is that gluOrtho2D() function is called with arguments that tell it when we draw the GUI primitives we draw them in the screen coordinates specified to match Windows, Mac, and other desktop screen coordinate systems. Such as top-left is (0,0) in (X,Y) format while bottom-right is (ViewportWidth -1, ViewportHeight -1). And glTranslatef() is used to correct for per-pixel accurate positioning. So that when we draw a line from (0,0) through (0,9) then the line will actually draw from the top-left and straight down ten pixels total in length and one pixel width.
Overall you're most likely just interested in what the ready2D() method is doing. I provided the other methods' source code examples to give you an idea as to generally how most games do 3D world scene and GUI drawing order.