In this tutorial series, we will cover a novel approach to coloring skin tones in realtime. Our technique will:
- Generate physically correct skin tones based on Monte Carlo reflectance simulations from spectral absorption data.
- Enable the realtime changing of skin color, whilst maintaining underlying pigmentation (such as blemishes, scars, moles, pink lips, even make-up)
- Support tan lines and realtime blushing
- Generate physically correct skin tones based on Monte Carlo reflectance simulations from spectral absorption data.
Why Do This?
Motivations for this approach.
More Diversity For Less Work
Achieving ethnic diversity in games is an important goal, and one that is so critically undervalued and ignored. This technique will allow to pick from a wide range of skin colors, and change the skin color of our characters, without having to re-author textures, or have convoluted workflows that normalize textures (i.e. greyscale textures) to hack a result. There is no reason not to even randomize your skin tones with this approach and get a truly diverse cast of characters.
More Believable Characters
“Facial appearance depends on both the physical and physiological state of the skin. As people move, talk, undergo stress, and change expression, skin appearance is in constant flux. One of the key indicators of these changes is the color of skin. Skin color is determined by scattering and absorption of light within the skin layers, caused mostly by concentrations of two chromophores, melanin and hemoglobin.“
Jimenez et al. [2010]
To get more convincing skin color, we need to be able to change the color of the skin at run time, such as with blushing, or when angry. We need to be able to “redden” the face.
In addition, we want our skin color to be physically-based. That is, we won’t want to pick from edited photos to sample our skin color – we want an albedo that is grounded in real values of human skin pigmentation. This way, we won’t need to spend as long calibrating our ‘guessed’ skin tones against real world photos – we will just have real values to select from.
Learn About Spectral Values and Monte Carlo Simulation
There’s no better excuse to learn something than for the sake of it! This will hopefully teach you something new. I had to learn many of the techniques demonstrated here just for this tutorial because I couldn’t find tutorials covering much of it anyway. Hopefully I can share these learnings, because Spectral Aborption, reflection and Monte Carlo simulations are great to have in your toolbox.
Table of Contents
Physically Modeling Skin Tones
Introduction: Setting Up
Part 1 (Theory): What Makes Skin Color?
Part 1 (Practical): What Makes Skin Color?
Part 2 (Theory): The Monte Carlo Simulation
Part 2 (Practical): The Monte Carlo Simulation
Part 3 (Theory): Spectral Reflection & Color Spaces
Part 3 (Practical): Spectral Reflection & Color Spaces
Part 3b (Practical): Python Imaging Library (Pillow)
Part 4: Skin Shader
Part 5: Extending the Shader
Part 6: Concluding Notes