Vertex shader implementation of Gerstner waves.
Normal artifacts can be fixed by applying this apporach directly in the fragment, which would be much more GPU intensive.
Vertex-oriented water simulation: GPU Gems 1, Ch.1
Blending normal maps: GPU Gems 2, Ch. 18
GPU-intensive FFT-based ocean simulation: threejs.ocean2
Skybox reflection from: threejs.ocean