compressing a voxel environment

Fd80f81596aa1cf809ceb1c2077e190b
0
rouncer 104 Jan 23, 2011 at 11:58

if i store my world in 256x256x256 chunks right, and have a paletized 8 bit colour, that means a single plane of voxels 65536x65536 would take 16 gigs to store.

with an 8 bit x position, 8 bit y position, and 8 bit z position, and 8 bit colour.

65536x65536 of these.

so, this is way too big.

I was just about to give up, when I just realized, hey, what if i just store the world in slats of voxels on disk, then just store the 8 bit colour, then i could get it to around a quarter of the size!

So, my idea is for every 256x256x256 chunk, to store a flat plane instead of storing every individual voxel, i store a start position and an x length, y length and z length, and use the x and z lengths to make the plane instead of using points for every single location.

that means cube like shapes store really easily, but angled shapes sorta store in slits.

Could anyone take the compression further than this?

I realize I probably could then runlength encode the colour data too, or maybe even use some kind of lossy compression.

2 Replies

Please log in or register to post a reply.

A77e71b962cd6c7c3b885f0488452f1f
0
tobeythorn 101 Jan 23, 2011 at 19:11

Your ideas seems pretty cool so far. If I’m understanding correctly, you would store a 256\^3 block as the volume of a plain intersecting a cube (assuming the block is solid and mostly planar?).

Here’s one thing that comes to mind (I’ve never actually worked with voxels before so take with grain of salt). This wouldn’t save you any disk space (is that your goal?), but would be useful cutting down on collision detections and rendering:

What about having level of detail substitutes for voxels, stored as a binary tree. You would have the level individual voxels, then you could calculate a 2x2x2 level represented as one bigger cube if sufficiently far from the camera. Then you would have the 4x4x4 level represented by one bigger cube if even farther from the camera. And so on. Then you could just load the parts of the world at the detail you would need as you need it.

Have you read GPU Gems 3. There’s a cool chapter in there that I believe uses voxels:
Chapter 1: Generating Complex Procedural Terrains Using the GPU
Ryan Geiss, NVIDIA Corporation

http://http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html

Fd80f81596aa1cf809ceb1c2077e190b
0
rouncer 104 Jan 24, 2011 at 14:58

Thanks for the reply.

Ill keep the idea to this at first, to keep things simple… then if I need to compress more later ill wait till then… ive got more things to do than just this at the moment.

That link is amazing!!! I hope to get something similar! Except mine wont be procedural, itll be 100% stored uniquely on disk.

I do have a chunk selection system very similar to what you suggested (And is in the link) already… really far chunks just zap off disk onto the screen in big hits, cause the voxels themselves are really large that far from the camera.

I just do it in hits of 256\^3, instead of individually, which [individually] actually could be better? Ill think about it.