Humus from beyond3d has done this - complete with source code:
http://esprit.campus.luth.se/~humus/
Specifically:
http://esprit.campus.luth.se/~humus/3D/Refraction2.zip
Refractions and reflections Thursday, April 11, 2002
Executable
Source code
This is a demo of a pretty realistic water surface. The waves are created dynamically by generating a texture with some perlin noise. The refraction is done by rendering the scene to a texture and then the wave texture is used to perturb the texture coordinates on a per pixel level in a fragment shader. Similarily for the reflections, except that they are rendered to the texture with y inverted. Finally, it's combining the refraction and reflection by interpolating between them depending on the view angle.
It'll only run on Radeon 8500 card right now.
2002-05-31:
Updated to run on drivers later than 6071. A driver bug was fixed that exposed a bug in this application, which I have now fixed. It won't run on older drivers anymore though.
--------------------------------------------------------------------------------
Required OpenGL extensions:
GL_ATI_fragment_shader
GL_ARB_texture_env_dot3
GL_ARB_texture_env_crossbar or GL_NV_texture_env_combine4
GL_EXT_texture3D
GL_EXT_texture_edge_clamp
GL_SGIS_generate_mipmap
WGL_ARB_render_texture
--------------------------------------------------------------------------------
Recommended OpenGL extensions:
GL_ARB_texture_compression
GL_EXT_texture_compression_s3tc
or try
sea
http://esprit.campus.luth.se/~humus/3D/Sea.zip