Oh yeah. On the topic of displacement mapping, there is at least one way to accomplish this. Probably more ways exist that I haven't thought of.
It will sound slow at first; bear with me.
Render into a float buffer surface, using whatever sort of cool fragment program computation you want to displace your vertices. Your "color" output in RGB is just your vertices' XYZ position.
Use ReadPixels. Then, point your vertex array pointers at your "pixel" data you just read back, and blast it back into the HW as vertices.
Slow because of ReadPixels? Not really, at least if you use the (new) NV_pixel_data_range extension. Use wglAllocateMemoryNV to get some video memory. ReadPixels into that video memory using what is known as a "read PDR", and then use VAR to draw the vertices. No bus traffic required.
Your indices can just be constants that represent your surface topology.
- Matt