Thursday, February 26, 2009

Procedural terrain algorithm visualization

When I tried to visualize resolution of elevation dataset we are currently using, it occurred to me it would be a good idea to visualize also the various steps and enhancements to the procedural refinement algorithm. These more or less show also how the algorithm evolved.

First, the terrain rendered with bilinear subdivision just to show the resolution of elevation data. We currently use ~150m dataset for whole Earth. All detail below 150m is generated procedurally.
To have a completely procedural planet, another algorithm would generate rough map with continental plates and mountain ranges, that will be then used as the basis for further procedural refinement.

The same terrain now with bicubic subdivision of tiles producing molten ice cream hills. The terrain is textured mostly according to the slope, with slight perturbation with another fractal.

Adding homogeneous wavelet noise to the bicubically subdivided terrain. Doesn't look right, though - no erosion except for the glacial one, that is visible even in the original data.

Shows symptoms of simple fractal terrains - different parts look similar.

To fix the erosion, the amplitude of noise is modulated by slope - flat areas have less noise, while the steeper get more.

This starts to get right, at least for the valleys, but the slopes are still too monotonous.

The idea for the next step is that anything below the angle of repose is subject to excessive sediment deposition, and is then more even and less noisy.

This creates larger continuous grass surfaces on moderate slopes, with rocks here and there.

One problem with slope-dependent noise is that the mountaintops tend to be smooth because the slope is low there.
The subdivision also distributes the flatness to wider area.
The solution is to make the amplitude of noise rise with positive values of curvature too, depending also on elevation.

Also an interactive comparison here.