CS6610 Final Project -- Thiago Ize and Justin Luitjens

We implemented the Real-Time Fur over Arbitrary Surfaces paper by Praun et al. for our CS 6610 final project.

Background

Since rendering tens of thousands of hairs thirty times a second is rather time consuming, Praun et al. created a clever technique to render the hairs using textures rather than the actual geometry. This is faster since drawing a picture of a million hairs requires about as much effort as rendering one actual hair. The tricky part is making it still look real.

The Method--or in other words--What We Did

The first step is to have textures of the hair you want to render, so we created a simple particle system that would create the hairs which go into the textures. To the right is an example of what it produces.

We create two types of textures using the hair geometry we produced: shell textures and fin textures. The shell textures are horizontal slices of the hair geometry used when looking at the fur from above and the fin textures are vertical slices of the hair geometry used for looking at the fur from the side. Since we are using 2D textures and we want the hairs to look 3D, we layer shell textures on top of each other so that the slices rebuild the original hair geometry -- a picture is worth a thousand words, so take a look at them!


Hair Geometry

Layered shells viewed from above


Layered shells viewed from the side

Shells don't look very nice from the side do they? Well, that's why we have the fin textures, which are meant to be viewed from the side. Take a look at it on the right.

Excellent, so now we have our textures. Next step is putting them on the model. Here's where we cheated and deviated from the paper. The paper uses lapped textures to parameterize the model so that you can slap on the textures in really cool ways. By using lapped textures you can have a hair direction and can comb the hair. The results look really cool, but alas, implementing lapped textures is the equivalent of a final project and we don't have that much free time lying around... So we cheated and got models that already have the texture coordinates baked in. This doesn't let us do the really cool things like combing hair, but it does allow us to put the textures onto the model in a logical way, so that's good enough for us.


2D fin texture

Here's what the bunny looks like with the shells:


Bunny with shells

The next step is to add the fins. We add fins to each edge of the model and have it stick up along the model's normal. Since we really only want to see the fins along the model's silhouettes (the shells work fine everywhere else), we blend away the fins where we don't want it. See the pretty pictures!

Bunny with all the fins drawn


Bunny with only silhouette fins drawn

Finally, when we put it all together, and add a sprinkle of modified Banks/Kajiya-Kay lighting models implemented in CG (for that special anisotropic and self shadowing touch!), we get:

The final result

The source code and windows executable can be downloaded here: Fur.zip