Hang on everyone....whoa!!!!
First off I'm very experienced and very knowledgeable about voxel data and terrains. Voxel maps do not take up that much space. Voxel maps are simply heightmaps and colormaps. The heightmap is usually greyscale and inside of the renderer you scale that to a 16-bit WORD which would give you a nice range of values.
The color map is an RGBA map but it could be in any format. It is no different than storing textures for a game. Voxel maps also can be created using several tiling tricks much like the idea I had above. The idea is that you tile the terrain and/or repeat it - thus you have very large view distances at very good framerates. Much of the voxel renderer code is highly optimized and uses many many lookup tables. There were several games that used voxels:
DOOM - yes doom is essentially a voxel renderer because with the raycasting you also had heightmapping so it fits into the category
Comanche helicopter series - except for the modern 3D ones - version 4 and up
Delta Force 1 and 2 - 6 degrees of freedom and in 2 you had detail texturing as well as smaller heightmaps overlaid on patches of the larger map - thus grass could actually be walked through and look reasonably believable. Six degrees of freedom and very good terrains - extremely well coded. Also had water effects and other 3D items blended with the terrain - very good engines for voxels. Delta Force 2 did suffer with framerates but 1 was extremely fast.
Armored Fist 1, 2, and 3? - 1 used voxels for everything - even the tanks which did not look good. 2 used polies for the tanks and voxels for the terrain. This is the same engine that was used in Delta Force 1 and 2 - VoxelSpace 1, 2, and 3 (32-bit color support and MMX support) by NovaLogic
Outcast - a bilinear interpolated or smoothed voxel renderer - although I much prefer Delta Force 1 and 2 - Outcast simply did not look good enough and the framerates were at best tolerable.
Command and Conquer Tiberian Sun - yes this also used voxels to render the terrain and certain objects.
Also some of the earlier games used movies of voxel terrains for their intro scenes - the computer at that time was not capable of rendering voxels in real-time.
Voxels are also used in medicine for cat-scans, xrays, and other examinations. These are extremely powerful voxel renderers. This is how the 3D pictures of the human skull and brain were rendered and textured later. Much can be done with voxels in this field.
Voxels are extremely useful but a lot of rendering tricks need to be applied to them to get them to look good. First of all, when the terrain is very close to the viewer it can quickly degenerate into a blocky mess. The solution is to use a diffuse filter and change the RGB values inside of the cells based on a diffuse map. This will make it appear as though there are more voxels than there really are. Also the height at close ranges should be at worst linearily interpolated, second bilinear interpolated, and best cubic interpolated - but much slower. The colors as well need to be interpolated for good effects. The height map should be extremely smooth - apply the smooth filter to the bitmap many many times. This will result in very smooth terrains. Smaller patches of 'voxel noise' can be applied to patches of cells or individual cells. Modulate these with the height values found on the map and you can simulate grass, etc. Detail texturing can be accomplished by rendering textures to the cells instead of simply using the color from the larger color map for the cell. Or even better modulate the alpha of the current color of the cell with the current terrain texture patch to create a very good looking landscape. As well you can use an offset map to offset the pixels being plotted - this will cause the defined blocks of color data to look fuzzy since they will share some color with their neighboring cells. Smooth this and it will look very good. For an example of this go to www.flipcode.com and look up voxel terrains. You will come across a very good voxel renderer that does implement this.
Another method is to voxel texture a triangle mesh. You are using polies, but you render with voxels - called voxel texturing.
Note that most of these techniques also apply to polygon terrains or meshes of triangles. No matter what rendering you use, the detail falls apart the closer you get - so you must add detail. And no, mip-mapping won't fix this because it is the linear, bi-linear, tri-linear, or anisotropic filtering that is causing the texture to be blurry. We want it to be blurry so the pixels cannot be seen, but at close range it looks like a blurred mess - so you must blend in another more detailed texture - that has also been filtered, with the current texture.
If you don't understand this take a texture and enlarge it in a paint program. Notice the squares of color you get. Now add uniform perlin noise to the texture. The perlin noise acts on all pixels, not just the squares so we can add detail to the enlarged texture. Now apply a smooth filter to it or soften filter and you will see that you still retain the original image, but you have more detail.
There are so many tricks and techniques...far too many to mention here. Also...raytracing as is looks way to fake. It's TOO perfect. Much needs to be done to add what I would call 'grit' to the picture. Everything in real life is not so color perfect as it is in a ray tracer. Yes in a perfect environment light would reflect perfectly off of objects and thus give a very shiny sheen look to things....but alas this does not happen. There have been many advancements made but there is much more to be done.
Voxels overall give very good details but are extremely expensive because no video cards actively or natively support their algorithms. They are based on firing a ray out into space thus ray casting and no video cards are optimized for this. Current GPUs are optimized for pushing polies - but voxels can produce similar images with less bandwith. There is much to be done in this field and hopefully it will take off.
But I'm not working on voxels now, I'm working on actual 3D meshes in Direct3D so I'm not sure where this convo got off track at. I was making the point that many of the texture tricks and techniques apply to all types of terrains and objects no matter what their rendering scheme is.
Also heightmaps and color maps are best stored in quadtrees not BSPs. Here is some code to show you why.
Code:
int CreateTerrain(int depth,int left,int top,int right,int bottom)
{
if (depth<1) return;
color=<some_color_algo>;
DrawBox(left,top,right,bottom,color);
midx=(left+right)>>1;
midy=(top+bottom)>>1;
//Upper left
CreateTerrain(depth-1,left,top,midx,midy);
//Upper right
CreateTerrain(depth-1,midx,top,right,midy);
//Lower left
CreateTerrain(depth-1,left,midy,midx,bottom);
//Lower right
CreateTerrain(depth-1,midx,midy,right,bottom);
return(0);
}
Pause this code after each iteration and you will see how it renders. Just imagine if you knew where to start based on the player's coords. It would simply be a matter of starting at that point and rendering all the nodes of the tree from there.