Skin shading tutorial
2017 note: This is a tutorial I wrote about 3 skin shading hacks I invented 18 years ago. I’m dusting it off again, because though this has become irrelevant for cinematics, it may still be useful to real time graphics.
Skin shading could be the single biggest hurdle in realistic cg… as for me, I’ve been wrestling with it since my beginnings 1995. And when I say wrestling, I mean I’ve been extremely frustrated by it, mainly because (until recently) very few knew much about it, and no one could answer my questions. So -99 I made my own method, basically a collection of 3 tricks, a direct approach that doesn’t require simulation. (When we have the power to do nice simulating, of course we should do that.) Terminology:
Day side = where light reaches
Night side = where light doesn’t reach
Terminator = the transitional zone
(2017 note: please excuse the lack of eyebrows, lashes and normal maps. Normal maps didn’t exist at this time, this is using bump maps. Also sculpting didn’t exist, this is a Subdivided Surface tweaked vertex by vertex in Maya.)
#1 Faking Translucency
(now called subsurface scattering or sss)
The skin seems a horrible greenish gray on the night side, no matter how realistic your paint job, and metallic orange on the day side.
So we need to make the day side cooler (bluer), and the night side warmer (redder). Also, we need to make the terminator the warmest of it all.
My first efforts used the ambient or incandescence channels (now in UE4 called Emissive) to make the whole head redder. I sometimes even tried making the color channel and spec channels bluish. But this is limited – when you get the terminator as warm as it must be, the night side is too red, and the day side too bright.
So what to do? As an artist who used to paint in the real world, before digital, I can’t help wishing I could reach out and paint the exact color I want, exactly where I want it… and so the answer came, perhaps too simple or obvious for people with a more scientific mindset… but in my experience this trick creates a credible illusion of skin (and other organic materials), for very little effort and rendering time.
(2017 note: yes extremely cheap effect, perfect for real time)
Find a way to edit the light based on the angle between the incoming ray, and the surface at that point. (Angle of incidence.) Thus enabling us to edit the colors of the terminator, day side, and night side each separately.
Most cartoon shaders have this function, and if you can get rid of the sharp edges that’s it, done. (We’re not going to use any outlines.)
The shader I use here takes its color info from a ramp (in Maya, just switch the interpolation to anything other than ‘none’). The original cartoon shader I used came from Tom Kluysken’s ‘Maya Queen’ site, and has been attributed to Duncan Brinsmead and Michelle Borghi.
(2017 note: today this might be called applying a 1D LUT, or color grading, which is commonly applied last as a global post process, I can’t seem to find any recent examples of it being applied like this, first in the process, to the initial rendering of specific materials.)
Here’s the graph in Maya for the translucency-fake (cartoon shader): (2017 note: I’ll leave it out since it’s obsolete.)
The highlights are a whole other set of problems. For this reason I like to isolate them on another layer, in fact here I use 2 layers: one for the glancing highlights (like the one on the left), and one for head-on or ‘flat’ highlights (on the right side). They gradually cross-fade into each other as the light revolves around the model.
(2017 notes: This dual architecture was later adopted in the Misss_Fast skin shader by Zap Andersson. What I call highlights here are called ‘lobes’ today.)
The important thing is to map whatever parameters the shader has for changing the highlight with regards to the angle between the light rays and the camera. In Maya you can use Blinn, SamplerInfo node, or ramps to control this change.
(2017 note: today this is called a Fresnel function)
Lets look at the most important and trickier of the two, the glancing highlight. It must become brighter and bluer and wider as the light becomes more and more glancing, finally flaring out into a long thin line in opposing light. (Now known as rim light.) Since I have another layer to handle the flatter angles, I make this glancing layer fade out before it hits ‘noon’ (makes it simpler if the highlights don’t overlap).
(In fact both layers are always slightly bluish – any specularity on skin must be somewhat blue to counteract the default tendency towards yellow/orange. This can be applied to other organic materials as well, like for instance greenery – in that case the highlight would be tinted red/magenta.)
#3 Specular bump trick
Any bump map should be of higher value on the specular and ramp layers, than the same one on the base-layer. This greatly increases the illusion of translucency.
(2017 note: today we use normal maps instead of bump maps)
(2017 note: this image is not raytraced, and should be possible to duplicate or improve on with just 2 lights in UE4 or any other game engine today. It would render extremely fast. If only Unreal would add the relatively simple functionality to make it possible. I was able to replicate these tricks in UDK, but then too many things changed for the next version.)
Copyright Steven Stahlberg 2001