I am basically using the same patch-based LOD algorithm as for planet rendering except that the terrain is flat and that the vertices come from a file rather than a noise function. Rendering really wasn't much of a problem as most of the tessellation algorithm was already implemented in Geist3D. In a nutshell, a separate thread reads terrain patches from a file and then generates the triangles meshes as a user navigates the scene.
The challenge was to generate the huge quad tree necessary to represent the terrain at all levels of detail. For that, I built an application that merges the DEM files and satellite images into a single file in the Geist3D terrain format. Each vertex contains the elevation and three color values. Since the DEM files and pan-sharpened satellite images have approximately the same resolution, each vertex in the final model has a unique color.
The screenshots are from a model covering the entire coastal region of British Columbia at 15 meter spatial resolution. The simulation runs in real-time on a dual core 2.1Ghz Pentium processor using an ATI 1950 Pro (256MB) graphics adapter. The terrain file is 3.1GB in size and contains 652,434 patches. After startup, Geist3D pre-allocates 1200 terrain chunks on the GPU which occupy approximately 68MB of graphics memory, leaving plenty of room for other objects. Even at the highest resolution, which consumes all 1200 patches, the frame rate consistently remains above 20 frames per second.
There are numerous details involved in building this model including sharpening the satellite images and smoothing the transitions between different levels of detail. If you have any questions about how it's done, send me a message. You can find a little more information and some movies at www.geist3d.com
I will post again soon and introduce the recent improvements to the Geist3D planet rendering engine. The planets now include tree cover....