A screenshot from the 'Archipelago' demo of GLScene (http://glscene.org, you can get the demo there,
along with Delphi source). Terrain rendering is a well trodden subject where geomipmapping and brute
force seem to have taken the honors recently... However, if the GLScene renderer is an hybrid
capable of mixing brute force tiles with dynamic Level Of Detail (LOD), this demo uses
view-dependant dynamic LOD exclusively.
512x512 heightmap at 16 bits precision
16 1024x1024x24bits terrain textures with detail map
tile-based, split-only ROAM dynamic LOD
animated waves, depth-based transparency
steerable sailboat with dynamic wake
basic OpenGL, nothing fancy, not even VAR/VAO, sorry ;)
You should expect more than 210 FPS on an Athlon 1800+ with a GF4 Ti 4200 at 1024x768x32, and this
figure is fill rate limited (140 FPS on the same CPU with a GF2 Pro in 800x600). The demo makes use
of the stencil buffer, so start it in 24 or 32bits desktop mode if you want to avoid software
rendering on some drivers.
The initial purpose was to showcase large textures (hence its size...), but it ended sweet enough to
demonstrate what simple dynamic LOD is capable of: most of the 512x512 heightmap is within visible
range in the demo, that would be 500k tris without dynamic LOD, which are reduced to 5k-13k by ROAM,
The landscape is fully tessellated by a split-only ROAM at each frame, using a tile-based
implementation close to what Bryan Turner describes in his Gamasutra article. CPU-wise, tessellation
itself takes a fat millisecond on a 1800+, the twist being that rendering starts before the
tessellation has completed, so it's not a wasted millisecond for the graphics hardware, especially
since the triangles being rendered are eating a higher than average share of fill rate.
The smaller wireframe image is a cutout from a wireframe screenshot, you can see that the triangles
on the far mountain have almost the same size as those on the nearby mountain (which is the whole
purpose of dynamic tessellation).
After the terrain layer comes a water layer, that renders wavy tiles over the visible terrain tiles
(reuses terrain tile culling), this pass is actually the range-limiting one in the demo (uses
several good-old-but-slow sin/cos per vertex).
Terrain elevation map and textures by Mattias Fagerlund
(http://www.cambrianlabs.com/Mattias/), heightmap and sedimentation
maps created with World Machine from Stephen Schmitt
Sailboat model and textures by Daniel Polli
Water and detail textures from Lemog's 3D Textures
Wake texture is mine, behold programmer art! ;)