The great Martin Upitis developed this while ago un pure glsl code. You can see a screencast in the following video:
Around 1:15m you can see camera going outside and inside water including many optical phenomena. Waterdrops in lens are made with perlin noise and require derivatives (which may not work in webgl 1) but the rest of the code is pure glsl so should be ported to threejs without problems