Saurabh Jethani / Creating realistic skin in UE4

Greetings everyone, in this article I’ll try my best to showcase how I approach creating skin for UE4.
Also this article includes using XYZ Multi-channel Faces maps and the new XYZ tileable MicroSkin library.
Here is also the MicroSkin Discovery page.

Hope this will be helpful!

Part 1- Introduction to Multichannel Faces
So texturingXYZ has released these awesome new maps. That changes the whole game how we are used to texture faces. The detailed use of these maps can be found:
  • Here, using Photoshop;
  • Here, with a killer Workflow, using ZWrap, an impressive tool.
Tip: To make things easier, go to ZBrush.
Fill your face with white, then paint all the landmarks (Brows, eyelids, nazalfold, nose, jaw, border of lips, etc.) using red paint. Create a texture through polypaint, export it out and multiply on top of your photoshop layer, you’ll have a guideline to place the points easily.

So I use Red and Green channel from my displacement map in zbrush to add pores. I keep things in layer to make them non destructive. Before applying the displacements I like to add a random noise which breakups the perfect feel from the sculpt and gives it more organic look.

Note: One cool thing Jeremy showed me, Just inflate your mesh by a small amount to get better looking pores.
Instead of the ones that just goes in and out.
Inflating does change your primary sculpt. So to fix that, save a morph target in lower subdiv. On highest, inflate the pores. Go back to lower subdiv, using morph bring back your primary info. That way you’ll maintain both your primary information and the inflate on pores.

Part 2- Textures
So the textures I used were:

Primary: Albedo, Cavity, AO, Normal, Roughness
Secondary: MicroNormal, Normal weight, Detail Tilables(Normal and Cavity), Detail Tilables Zones, Roughness Tilables
Optional: Specular, Translucency, Height

  • Primary:

Albedo: Color information for the face. Since the new XYZ maps comes with albedo packed together. My color info matches my displacement, I just saved out the albedo and did hand painting to add information specific to my character.
If you are looking for hand painting the whole albedo, this is an awesome video to watch!

Cavity: Cavity map is just a black and white map where everything is white, but all the pores are black. Cavity map in going to be used in lot of places, this one helps us a lot to bring back the pore informations we lose from subsurface shader.
I still extract cavity from zbrush, but have heard good things about Knald for baking it out.

AO: Ambient occlusion baked down from high poly to low poly mesh.

Normal: Normal information baked down from high poly to low poly mesh.

Roughness: I still believe it’s one of the most artistic map for skin, in terms of how they are constructed. Everyone have their own way of making one, but the common principles still remain the same:
  1. Base Value : Just a flat value that defines the default roughness value.
  2. Zone Changes : Defining the changes in roughness of zones. Some zones are more glossy, or some are more rough than other. Ex.Lips, tip of nose being more glossy, or jaw, stubble being more rough than other.
  3. Pore Changes : Different roughness values in the pores. I use cavity map to add this change.
  4. Specific elements : Specific things to your character. Like wound, scars, warpaint etc.

Note: If you want to use a texture for roughness, the material supports it. I am using a zone map inside UE4 for roughness, that gives me the ability to change my roughness in real time inside UE4. That get rids of the back and forth, and I can look dev easily.
The map is an RGBA map, where zones are separated into channels.White color in channels will define the zones, whereas the black parts will be unchanged.

A map with ALPHA channel should be exported as ‘TGA 32bit’.

  • Secondary
MicroNormal: Micro Normal map is applied on top of our original normal map to enhance some of the micro details. I extract it out of Blue channel of our XYZ displacement. Run it through a software like Crazybump to convert it into normal map.

DetailTilable: Detail tilables for pores. They will tile on our model to give us finer details which even a 8k map cannot capture. Detail tiling require two maps. Normal and Cavity. If you wanna use your own normal map, make sure you extract a cavity map out, software like Knald can do that.
But hey, Why go for something else when you can go for the best one available.

DetailTilablesZone: RGBA map that defines where each tilables will affect the face. The Red channel controls the 1st tilables. Followed by G B A controlling 2 3 4 respectively. The material allows for 8 Tilables, the option needs to be turned on. After enabling, the second R G B A controls 5 6 7 8.

Normal Weight: A black and white map, which globally controls where the MicroNormal and DetailTilable affects. For example, lips have their own specific details. There should not be much or any random breakup. So we mask out that area with a Normal Weight map.

Roughness Tilables: Just a black and white noise map, which break up the roughness on micro level, giving your pores and detail tiles more moisture and life.
Note: The primary elements should be enough to give you a good looking skin in UE4. Rest of the things in secondary are to improve upon it. Make sure you are happy with you primary elements before moving forward.

  • Optional:
We do not need these maps, but the material supports the use of them in case you need them.

Specular: Specular map instead of values and sliders.
I will recommend not using a spec map, in most cases it seems to break the shader.

Translucency: Defines the opacity of zones on face. Flat values work just fine.
In case you need a RGBA zone map, the material supports that too.

Height: Height map does comes in play for super closeup.

Adam Skutt came up with this trick to have your height map control the intensity of tilables using height map. For example, a mole will stretch the skin in micro level, resulting in the pores to be less intense. Height map helps with that, plus it also gives the face displacement. Which is an overkill but it’s there if you need it.
Make sure the tesselation multiplier is more than 1.

I extract the height map from Green channel of XYZ displacement map. Clamp that inside photoshop to get more black and white.

Part 3- Skin Material

Download the UE Skin Material here:

So here is the material system I’ve build using MEET MIKE material as a starting point. The texture sample source is set to Shared enabling us more than 16 maps.

We probably will never use all the settings it has, but I wanted to have all the possible options I could have think of, incase someone needs it.

So here is what our material is doing. The names in the shader should be self explanatory, but if you need a reference guideline. Here it is.

Note: If you want to use 8 Tilables. Under Tile04, there is a switch named Unlock Next Level. Yes! That’s what I name it. Just turn it on, and you’ll have other 4 tilables on.

Part 4- Skin Shading

The unreal skin shader has gotten super super awesome!!
For this one we are using subsurface profile ‘SP_Head’ from meet mike demo.

There are no specific values that’ll make your skin look realistic. It comes down to finding good references and matching those.

There are two elements I feel are important for skin shading:
  • Subsurface
  • Specular
SSS in UE4 uses a subsurface profile. 0.95 for scatter radius seems to be a fine point for real sized head. A peach/reddish falloff color works fine for skin. I keep the subsurface color to nearly White. Boundary color bleed will define the bleeding of color from one subsurface material to another.

Transmission I keep to default value most of time.

Unreal recommends 0.5 as a default specular value. But an important thing unreal has added in is the ability to have dual lobe specular.
Skin has two specular lobes instead of one, which makes for better rendering. The dual specular helps achieve extra spec and gloss around the highlights to mimic the oily surface of the skin. It helps skin look better, both in micro and portrait level.
Adding a cavity map helps remove specular reflections inside pores non-destructively. It can be baked into the specular map, but having a slider is much more flexible.

Skin is all about subtleties. Find good references and try your best to match them while making sure it looks good under every lighting condition.

Part 5- Tileables

The Normal map is being blended in our main normal map. The Cavity map is being used to affect our Spec,Albedo,AO and Roughness. Making a tilable node system is really easy, it’s just when you have 8*2 (16) Maps to add in your Normal,Spec,Albedo,AO and Roughness. Things do get a little messy, keep that in mind.
You guys can download the Skin material I created to have an in-depth look .

But here is a simplified version to show how to have tileables in UE4:

To make textures tile in UE4 you need a 'TexCoord' node and multiply it with a 'Constant'.
That Constant will define how many time your map tiles. Just plug the multiply node to 'UVs' input on your texture for it to work (ah shown in Section 4).

To control the intensity of Normal Map, multiply it with 'MakeFloat3' node. Where the 'Z' input is connected to a 'Constant' with a value of 1.
And both 'X' and 'Y' are connected to another 'Constant'. This one will control the intensity of your Normal map (that said 'Constant' is in Section 3).

To use a Mask defining which area will affect the Normal Map, multiply this Mask Output with the 'MakeFloat3' node.
Where 'Z' Input is connected to a 'Constant' with a value of 1.
Both 'X' and 'Y' are connected to the Mask.
Section 3 showcases using MakeFloat 3 node, while Section 1 is the Mask.
In this situation, our Mask information is in the Red channel, for the first tileable Map.
The other channels contains Mask data for other tileable Maps.

Section 5 and 6 are Normal and Cavity Map respectively. Their 'UVs' Inputs are connected to section 1 for Tiling.

Section 1 being our '1st Detail Normal' map output, we blend it with our '2nd Detail Normal' map.

The first output connects to 'BaseNormal' of 'BlendAngleCorrectedNormals'.
The second normal map will be connected to the 'AdditionalNormal' input of the same Node, as shown in Section 2.

Make sure to connect the output from 'BlendAngleCorrectedNormals' to the 'Normalize' Node, before processing it afterwards.

Section 3 represent the second, third and other tileable maps you would like to plug in the Shading Network.
They will be connected with the previous Normal Ouput, the same way as shown in Section 2.

This chain will go on until it connects with the Original Normal Map (Section 4), where the Original Normal Map will connect to the 'Base Normal' of 'BlendAngleCorrectedNormals'.
The Output from the final Normal Map has to be plugged in 'AdditionnalNormal' Input, as shown in Section 5.

Our Cavity Map is shown in Section 1, and out RGBA map is in Section 2.
The Red Channel is being used to extract our Mask information.
Obviously for the '1st Detail Cavity' map. Other channels will be used to store the different Detail Cavity Maps.

To have a Cavity control in our Material:
First, connect our Cavity Output in 'B' input of 'Lerp' node (LinearInterpolate).
Connect a 'Constant' with a value of 1 to 'A' Input of 'Lerp'.
Connect another 'Constant' to 'Alpha' input of 'Lerp'.
This 'Constant' will control the Cavity intensity!
Do this, as shown in Section 4, for both Albedo and Spec Sections.
Then, connect the 'Lerp' Output from Section 4, in 'B' Input of another 'Lerp' Node.
Connect a 'Constant' with a value of 1 to the 'A' input of the same 'Lerp'.
Connect the Mask to 'Alpha' input of 'Lerp'. This will affect where the Cavity will be displayed.
Do this for both Albedo and Spec, like in Section 5.

For Specular control:
Multiply the base specular with the output from 'Lerp' node from Section 5 of '1st Detail Cavity' Map.
To add more Detail Cavity control in Spec, multiply the output from previous multiplication.
As shown in Section 8, the final output for 2nd and 3rd Detail Cavity is represented by a '0' Constant.
The chain will go on until it finally connects to the Specular input in the Shader.

For Albedo control in our Material:
Repeat the same actions done for Specular control, until Section 5.
Since we want to have a control for color in the Cavity, instead of 'Multiplying' the Output from the 'Lerp' of Section 3, connect the Output to the 'Alpha' Input of another 'Lerp' node.
Connect a 'Constant3Vector' to the 'A' Input of the same Node.
This will control the oclor of our Cavity.
Connect our Original Albedo (Section 3) to 'B' Input of the same 'Lerp' Node.
To add more Detail Cavity control in Albedo, connect the Output from previous 'Lerp' node to the 'B' input of another one. 'A' Input of the same 'Lerp' Node will have a 'Constant3Vector' connected to it. And the 'Alpha' will have the Output of Section 5 of '2nd Detail Cavity' connected to it.
As shown in Section 6, 'Constant3Vector is represented by a 'Constant' with a value of 1, and Section9 features the Outputs from different Detail Cavity Maps.
Repeat this for as much Tileable maps you have, then connect to the Albedo Input of the Shader.

The control for Cavity in Roughness or AO will be constructed the same way as in Specular.
I also use a random noise, that tiles over my roughness and breakups my roughness in Micro level, giving it more fleshy and alive look.

Note: Before using the cavity map, they need to be processed for engine.

All you have to do is, clamp the map inside Photoshop to get more black and white values. What you want is everything to be white, and the cavities to be completely black with a bit of gradient.

If you are looking to do same things with tilable in Marmoset toolbag 3.
John O. Owsment has an awesome shader for it!

The UE4 material is inspired from his shader work.
And if you are looking for skin construction in Marmoset, I made an article a while ago.
But I still follow the same principles, it can also be helpful to cross check with this article to better understand what I am trying to convey:

Hope this was helpful. Have a nice one!

Saurabh Jethani's: ArtStation | Instagram
We would like to thank Saurabh for his helpful contribution.
If you're also interested to be featured here on a topic that might interest the community, feel free to contact us!