Subdivision Surface Modeling
CSC 473 Spring 2011
I chose to do subdivision surface modeling for my final project. Subdivision surfaces are recursively generated smooth meshes. There are several models for mesh subdivision, but I chose Catmull-Clark subdivision. Surface subdivision involves creating several new faces for each face in an existing mesh based on the points in the face, as well as the points in neighboring faces.
An example of Catmull-Clark subdivision on a cube mesh, with 0 through 3 levels of subdivision.
The bottom image shows the resulting mesh without outlines.
Unfortunately, I was unable to get subdivision surfaces completely working. Although I could create one-level subdivision surfaces with certain meshes, they contained artifacts, and going past one level of subdivision or using some meshes resulted in noticably incorrect meshes. In order to do subdivision, I had to add support for POV-Ray's mesh2 object to my parser. This is a triangle mesh made up of a list of vertices, as well as a list of faces represented by the indices of the vertices that make up the face. The primary model I worked with was a triangle mesh representing a pawn from a chess set.
Left: The input mesh with no subdivision. Middle: After one level of subdivision. Right: After two levels of subdivision.
Bounding Volume Heirarchy
I also implemented a bounding volume heirarchy. Although I did not use CUDA to parallelize my raytracer, this allowed my raytracer to perform nearly as fast as those of some of my classmates who did. Using a bounding volume heirarchy made my program perform roughly 100x faster on a scene of average complexity, and more so on scenes with higher complexity. For example, bunny_tasty, with a total of around 70,000 triangles and 35,000 spheres finished in over an hour without BVH, and in just over a second with BVH enabled (for an image size of 256x256), producing a speedup of around 3600x.