When I loaded Aubrey's new rabbit model, it was clear that we needed a new rendering method in order to do it justice. Our basic object shader works best for hard surfaces like wood, leather and stone, not fuzzy ones like fur and cloth. This problem was most obvious when the model was lit from behind:
It suffers from the 'plaster effect' -- it doesn't have the subtle shading effects that characterize the materials, so the surfaces that should look soft instead look harsh and rigid. In real life, fur and cloth always have tiny stray fibers that catch the light when lit from behind, giving a 'halo' effect. We can start to approximate this halo by lighting up surfaces that are perpendicular to our viewing direction, like this:
This is often used as a 'selection' effect in 3D games because it's an easy way to highlight edges. However, it needed to be toned down before we could use it as a realistic effect. First, I decided to modulate the brightness of the highlight by a softer version of the standard lighting equation, so that surfaces facing directly away from the light remain in shadow.
Finally, I used one of our unused texture channels (the alpha channel of the normal map) to specify which parts of the model are affected by rim lighting. This gives us detailed control of how fuzzy each surface should look. Here's the final shader applied to the rabbit model:
While I don't have time to make a detailed fur shader yet, I thought this effect went a long way towards making the rabbit's fur and clothes read as 'soft' materials. Does this effect work for you? Can you think of any ways that I could improve it? (permalink)