I assume you're after this kind of old-school, 2d effect:
If so, you're correct.
- Render your "real" frame to an FBO.
- Render the top part to the framebuffer using a simple textured quad, using the FBO as the texture.
- Render the bottom part mirrored, with some horizontal waves.
You have several options on how to achieve the third. The simplest way would be to render one pixel high textured spans, stretch and offset them. Alternatively you could use shaders and do even more interesting effects.
Other things to try include tinting the mirrored version towards blue a bit, as well as varying the brightness of the scanlines ("wave" them too).
You can also grow the waves further away from the mirroring point.
This effect is also completely possible with good old plain opengl 1.x, even without FBOs. Render to texture and use glReadPixels to read the top part back to system memory, upload it as a texture and then do the scanline-by-scanline rendering. This, however, is so slow that if you can use FBOs, it's always a much better option.
EDIT: suggestions for the shader bit
I recommend doing these step by step, so you'll see what each change does, and adjust them based on what you're after.
where FREQ and AMP are constants you'll find by trial and error. Both are below zero. Let's say start with 0.1. 't' is a time constant, probably a float uniform.
or possibly (1-v), depending on how the texture is oriented. You may wish to increase AMP after this change.
Since the texture coordinates go outside the 0..1 range, you may wish to scale it back, like..
u+((sin((v+t)*FREQ)*AMP+AMP)/(1.0 + 2*AMP)) * v
Depending on the scene you're rendering, the above may look worse than letting it wrap.
Note though that all the calculations above are off the top of my head without texting, and may contain mistakes, but that's the basic principle anyway. You may also want to try swapping u and v for another kind of wavy effect, or even combine the two.