A visual guide to voxels

Just a guy who loves to write code and watch anime.
Search for a command to run...

Just a guy who loves to write code and watch anime.
No comments yet. Be the first to comment.
Qualities that make outstanding builders.

Bipedal vs quadrupedal: how many legs This is about the number of legs the creature walks on. Bipedal. Two legs. Humans, ostriches, T-rex, kangaroos, most fantasy humanoids. Quadrupedal. Four legs. Do

Intro You hear "lerp" and "smoothstep" everywhere in game dev. They sound like math jargon. They're not. Both are small tools that do the same job: smoothly move from one value to another. The problem

What is Kinematics Kinematics is the math field. It's the study of how things move without worrying about forces (which would be dynamics). FK and IK are the two branches: forward kinematics and inver

Intro Textures are usually the biggest cost in a 3D scene. Memory, bandwidth, and load time all get eaten by them. Resizing them is the obvious lever. There's more. This post is about the less obvious

A voxel is to 3D what a pixel is to 2D.
A pixel is a tiny square in a 2D image. A grid of pixels makes a picture. Your screen is a grid of pixels. Zoom into any photo and you see them.
A voxel is a tiny cube in a 3D space. A grid of voxels makes a 3D world. Minecraft is the famous example. Each block in Minecraft is essentially one voxel.
The word "voxel" comes from "volume element," same way "pixel" came from "picture element." That's the whole origin of the name.
The cube shape is just for visualizing. A voxel is really a cell in a 3D grid that stores some data.
What data? Whatever you need:
1 bit: solid or empty
1 byte: which material (stone, dirt, water, air)
More bytes: material plus light level plus temperature plus whatever
In code, a voxel grid is just a 3D array:
voxels[x][y][z] = someValue
Every cell holds a value. The values together describe the world.
A useful way to think about it: voxels are not really cubes. They are points in a grid that happen to get drawn as cubes when you render them. The "cube" is a rendering choice, not a property of the voxel.
Storage adds up fast.
A grid of 256 by 256 by 256 voxels has about 16 million cells. At 1 byte each, that's 16 MB. Manageable.
A grid of 1024 by 1024 by 1024 voxels has about 1 billion cells. At 1 byte each, that's 1 GB. Too much for most cases.
Two tricks games use to deal with this:
Chunks. Split the world into smaller blocks of voxels. Minecraft uses 16 by 16 by 256 chunks. Only keep the chunks near the player in memory. Load them in as the player walks toward them, unload them as the player walks away.
Sparse storage. Most voxels are usually empty (air). Don't store them at all. Use a tree structure called an octree that splits 3D space into 8 child cubes recursively, only storing the child cubes that contain something. Empty regions take almost no space.
These are engineering details, not voxel concepts. The core idea stays the same: a 3D grid of data.
Three main reasons people use voxels:
Destructible or modifiable worlds. Changing a voxel is easy. Flip a 1 to a 0 and there's a hole. With a normal triangle mesh, modifying geometry mid-game is much harder. Games like Teardown and Minecraft lean on this.
Procedural generation. Filling a grid with numbers is something computers do well. You write a noise function, sample it at every grid point, and terrain appears. No artists needed.
Medical and scientific data. MRI and CT scans naturally produce voxel grids. Each cell holds a density value from the scan. Same data structure, completely different field.
Two big challenges.
Memory. As shown above, voxel grids are huge. Storing them is one problem. Sending them to the GPU each frame is another.
Rendering. A GPU draws triangles. Voxels are not triangles. You have to convert your voxel grid into triangles before you can draw it. This conversion is called meshing, and it's where most of the complexity lives.
There are three common approaches:
1. Just draw cubes. Each solid voxel becomes a cube made of 12 triangles. Optimization: skip faces that are hidden inside the world. This is what Minecraft does. Output is intentionally blocky. Looks like Minecraft.
2. Smooth the surface. Treat the voxel values as a continuous field. Find where the field crosses zero and draw a smooth surface there. This is what marching cubes does. Output is smooth, no visible cube faces. Used for natural terrain, caves, organic shapes.
3. Ray march. Don't make triangles at all. For each pixel on screen, walk a ray through the voxel grid and find what it hits. Slower for big scenes but supports things triangles can't, like translucent fog or true volumetric effects.
A voxel is data. The cube is just one way to draw it.
Same voxel grid can become:
Blocky Minecraft terrain
Smooth natural mountain
A semi transparent cloud
A medical scan visualization
The voxels don't change. The rendering algorithm does.
If you remember nothing else: voxel = 3D pixel = a cell in a 3D grid storing some data.