The goals we have set for this project are not trivial to reach. Many other attempts at voxel based landscape rendering have been done before. Most of them are sup-par to the goals we aim for. The reason for this is the high memory requirement for longer view distances along with the fact that using straight-forward methods for rendering quickly proves to be insufficient when you increase the view radius since the amount of voxels increase cubically. For instance, with the most obvious approach of just keeping every voxel in memory would with a view distance of only 1250 voxels in every direction end up with a memory usage of 1250³ = 1 953 125 000 bytes (1.8 gb) if one byte is to be used per voxel.
Due to these issues, a good data structure is needed. We have been looking around and reading about other similar projects to use their ideas and solutions as inspiration and information source when designing our own system. Although we didn’t find any project with an idea that would solve our problems and make our vision possible, we did learn about various standard approaches and what result they yielded which was very useful for our design decisions.
There are two main methods that people tend to use for data storing in projects like this: Plain arrays or octrees. Plain arrays means that the voxel data is represented using one or several arrays that spatially describe the voxels. Octrees is when you subdivide space into a tree structure where you only represent the voxels at the leaf nodes. Using plain arrays just like that is easy and works quite well. But it doesn’t allow you to have long view distances since the abount of data needed scales drastically. With an octree approach you can easily implement a LOD based method. But it also creates an overhead when working with the data since traversing an octree is more difficult than simple arrays. Besides, it is difficult to find a LOD solution that looks satisfactory with voxels.
To avoid these problems we decided that we need to come up with something more complicated to better manage the data. Our idea is based on the fact that you only really need the data that corresponds to voxels visible by the player. A grid keeps track of the parts of the map that are loaded. Using CPU ray-tracing, it can be decided when to load the needed data.
The design of the data structure will be an active topic through the first weeks of the project and the ideas we have now might change a little. Hopefully we have built a good enough foundation to stand upon to be able to start building the system.