September 29th, 2009
The rim lighting shader went a long way towards making the fur look soft when lit from behind, but it still looked hard when lit from the side. This problem is so prevalent in modern games that I've started referring to it as "plaster-hair syndrome" -- when hair or fur is sculpted with great detail, but lit as if carved from plaster. This lighting problem is visible on the rabbit's chest here:
What we're missing is a form of subsurface scattering. Fur is translucent, so no individual clump of hair should be opaque enough to produce such sharp shadows. Aubrey and I had discussed a technique for painting soft fur earlier -- blending the fur with multiple blurred copies of itself. This softens the lighting without losing the tiny surface details. If that works for paintings, why not apply that to the normal maps and see if it works in 3D? On the left is the original normal map, followed by two blurred copies, and then the final composite. The final composite is made by taking the original normal map, and layering both of the blurred copies on top at 50% opacity.
By assigning different weights to the blurred normal map copies, we can control how soft we want the fur to look. Here we have three different versions, from hard to soft. If you click to zoom in, you can see that even the softest option still has the fur detail intact.
So does this solve our problem with plaster fur? Let's see how it looks when it's all put together! On the left is the original image from the start of this post, and on the right is the softened version.
Here's the same scene lit from above.
I think that the softened normal maps really help solve the 'plaster' look, and it achieves that with no effect on framerate! It's always nice when we can make Overgrowth look better without using any extra computational resources. Can you think of any examples of games that effectively render fur or hair without using powerful hardware? Some of the most inspirational to me have been Shadow of the Colossus and Final Fantasy XII.