Consider deferred lighting. In a nutshell, deferred lighting is a technique that uses a reduced version of deferred shading to calculate a screenspace lightmap. In a second pass, the geometry is rendered again using the screenspace lightmap as lighting information.
This technique is used to reduce the size of the G-Buffer, since fewer attributes are needed. It also buys you the advantage, that the G-Buffer and the screenspace lightmap can be of lower resolution than the screen.
I had implemented a strict GLES 2.0 based renderer (although an experimental one), and I managed to boil the G-Buffer down to one RGBA texture (yes, I used a texture2D instead of a renderbuffer). It contained the screen space normal map + the depth buffer in the alpha channel (which was compressed using a logarithm, as far as I remember).
The position attributes (called world here) can be calculated during the lighting pass using the fact, that in a perspectivic projection, .xy is devided by .z, so that:
I approximated the position attribute's xy by doing:
Note: I had to do further adjustments depending on the projection matrix' settings.
Also worth noting is, that I was capable to omit the .z component of the normal vectors, since i could reconstruct .z from .xy since the normal vector is normalized so that:
Using this technique, i was capable to free up another channel in my RGBA G-Buffer and used this to store the screen space specular-map (or glossiness, if you will).