Skin rendering in Unity

Rendering realistic-looking human skin is a very complex process, in great part due to the amount of subsurface scattering that can be observed in that material. Subsurface scattering is a phenomenon where incident light is scattered inside the material and is either absorbed or exits through a different point in the surface, leaving a distinct visual that can be easily noticed in wax, marble and skin, among several other translucent materials.

In GPU Gems 3 - Chapter 14, Eugene d'Eon and David Luebke described a technique that exploits the capabilities of modern GPUs to implement a physically accurate skin rendering model and execute it in real-time. In their work, the Kelemen and Szirmay-Kalos BRDF is used to calculate specular reflectance and a sum-of-gaussians is used to approximate the diffusion profile that models the way light is scattered by skin. Additionally, a modified version of Translucent Shadow Maps is used to simulate transmission through thin areas.

With the objective of learning more about shaders and computer graphics in general, I have implemented their method using Unity Engine 5. This project presented several challenges, such as integrating with the existing Unity shadow maps, removing texture seam marks from the model and implementing Translucent Shadow Maps. Overall, I had a great time implementing this technique, learned quite a bit in the process and ended up very pleased with the results. In the near future, I plan on writing a blog post detailing the implementation process.

The source code for this project is publicly available at https://github.com/leonardo-domingues/skin-shader-unity.