Using scrolling normal maps for water gives us a nice look for tranquil lakes and such. In order to get something that looks like it’s actually interacting with the environment though, we need to actually modify the water geometry.
Sine waves are one option: basically we’d displace the height of the water vertices based upon sine wave. A better option are Gerstner waves . They improve upon simple sine waves in that a vertices xy position is also changed, which more accurately models how real water waves look (see the linked article above for a better explanation).
Gerstner waves are what I currently use in the water shader in my engine. I layer four of them on top of each other to create sufficient variety. At any one point, one of them is fading to zero amplitude in order to be replaced by a new random wave.
I don’t yet have them tied to the wind in my world, but the plan is to roughly align them with the current wind.
One advantage of using a strict calculated wave like this is that I can duplicate these calculations on the CPU in order to, for example, place an object in water and have it bob up and down.
Ideally I would have a water simulation that allows for real interaction with the environment: “bouncing” off cliffs and speeding up over shallow water. I haven’t yet looked very far into doing this, but I would imagine I would still use the Gerstner waves as “energy input” to the water simulation (i.e., the wind action).