A Fast Voxel Traversal Algorithm for Ray Tracing John Amanatides Andrew Woo Dept. of Computer Science University of Toronto Toronto, Ontario, Canada M5S 1A4 ABSTRACT A fast and simple voxel traversal algorithm through a 3D space partition is intro- duced. Going from one voxel to its neighbour requires only two floating point compar- isons and one floating point addition. Also, multiple ray intersections with objects that are in more than one voxel are eliminated. Introduction In recent years, ray tracing has become the algorithm of choice for generating high fidelity images. Its simplicity and elegance allows one to easily model reflection, refraction and shadows. 1 Unfortunately, it has a major drawback: computational expense. The prime reason for this is that the heart of ray tracing, intersecting an object with a ray, is expensive and can easily take up to 95% of the rendering time. Unless some sort of intersection culling is performed, each ray must intersect all the objects in the scene, a very expensive proposition. There are two general strategies for intersection culling: hierarchical bounding volumes 1, 2, 3, 4 and space partitioning. 5, 6, 7, 8 The general idea of the first approach is to envelop complicated objects that take a long time to intersect with simpler bounding volumes that are much easier to intersect, such as spheres or boxes. Before intersecting the complicated object, the bounding volume is first intersected. (Actually, it is not a full intersection test; all we care about is if the ray hits the bounding volume, not where). If there is no intersection with the bounding volume, there is no need to intersect the complicated object, thus saving time. For a complicated scene made up of many objects, a bounding volume is placed around the entire scene with each object also containing a bounding volume. If an object is made up of several parts each of these parts can also have a bounding volume. We thus can built a tree of bounding volumes, with each node containing a bounding volume that envelops its children. Objects within a subtree are intersected only if their parent node bounding volume is intersected by the ray. In this manner, the amount of actual intersections are significantly reduced. Of course, we now have to spent time intersecting bounding vol- umes but this is more than offset by the reduced total intersections. The second approach of reducing intersections is to partition space itself into regions or voxels. Each voxel has a list of objects that are in that voxel. If an object spans several voxels it is in more than one list. When a ray is shot, we first look into the voxel in which it originates. If it hits any objects in the starting voxel’s list, the intersections are sorted and the closest one is retained. If the intersection is in the