Friday, 7 June 2013
I'm on holiday on the South coast this week, and after amazing weather, this morning it's had the audacity to rain, so I thought I'd see how difficult it would be to make a fake-but-sometimes-plausible procedural texture for emulating waves on the sea via displacement.
Jerry Tenssendorf's seminal paper “Simulating Ocean Water” is essentially the way to do it accurately, using a discrete Fourier transform, which allows very accurate modelling of wave peaks and troughs based on the wind interaction and gravity, and indeed other waves around them.
I only had a couple of hours I wanted to devote to it, and couldn't get into that level of detail, so I tried to fake it by just using Simplex noise modulated by the sine of the texture coordinates.
Basically, at a very simple level (ignoring wind which is pretty important for accurate simulation), the peaks and troughs of waves on the sea closely resemble a trochoid, which can be emulated with the sin() function. I ended up modulating two different resolutions of these waves (major primary waves and smaller secondary waves) on top of each other along with noise, which at least for non-open-water waves (open water waves crests tend to have angled peaks when it's windy and when the number of waves increases) with moderate wind, gives reasonable results. It's certainly better than just random noise. But it's very rigid and consistent even with the noise modulation, so for large areas it basically looks like a tiled texture.
At some point, I'd like to investigate implementing Jerry Tenssendorf's paper to do it accurately.