For the (semi secret)game I am currently working on(http://www.PompiPompi.net/) I had to implement the background or backdrop of the 3D world.
A simple method to draw the background is having a textured sphere mesh surround the camera.
The issue with this method is that the sphere is not perfect so there are distortions and it doesn’t completely fit the viewing frustum. Which means some geometry that is inside our frustum will be occluded by the sphere.
A different method is to draw a screen space quad at the exact back end of the frustum. This quad will have coordinates in screen space and won’t require transformation.
The back of the plane in screen space coordinates is 1.
You could disable writing into the ZBuffer with glDepthMask(false) and draw the background first. All the geometry that renders afterwards will overwrite the background.
However, what if we want to draw the background last and save on fill rate by using the ZBuffer?
Just drawing the background last should have done that but instead it might not render at all.
We usually clear the depth buffer part of the render buffer into 1.0 which is the highest value for the depth buffer. But our background screen mesh is also rendered into 1!
It turns out the default depth test function in OpenGLES is GL_LESS. Since the ZBuffer is already 1.0 our background screen mesh won’t render.
What we can do is before rendering the screen mesh, we can set the depth test function into less or equal by calling: glDepthFunc(GL_LEQUAL);
This way our background buffer will not draw at pixels that we have drawn geometry before but will draw on the rest of the “blank” pixels.