Photorealistic Skin & Hair Shading Tutorial

Santhosh Koneru is a Freelance Graphics Designer & 3D Generalist. After 4 years of working as a digital matte painter, UI/UX designer and Photoshop Instructor, he moved to Hollywood for specializing in 3D and VFX. There, he attended Gnomon School of Visual Effects, winning the Grand Prize for his Short Film in 2016.  In this tutorial, he’ll take you step-by-step on the process of creating a photorealistic finished render for skin and hair.


Photo-Realistic Skin Shading with AlShader

alShaders have great physical properties, which gives very convincing output. For skin shading I prefer using alSurface, the best quality about this shader is that it will not loose your tertiary skin detail in the process. Once you install the alShader you can find it in Create>Vray> Create from Vray Plugin > BRDF Material. Adjust the Roughness and Specular to the level you are happy with.

At this point, assuming you have your Diffuse and Sub dermal maps, proceed to adding textures to the shader. (For this project, I used Texturing.xyz textures for Albedo and Subdermal.) Create a file texture node in hypershade and set it to “Allow input gamma” in Attributes > Vray. This is done to keep the workflow linear.  Then set the Filter Type to “Off” or “Mipmap” and load the albedo maps to it. If you exported your maps from Mari, then set the UV Tiling Mode to Mari. Do the same for sub dermal maps and spec maps.

With the Specular texture node selected, go to Effects and click on Color Remap “Insert” to create a ramp. With this, we can control the intensity and the spec break.

Moving to the SSS, we will now be using a few color correction nodes to create Epidermal and fat layers that go under the skin which allows us to achieve a nice photo-realistic result with SSS. Connect the Sub dermal texture node to SSS 1 Color, then create a Gamma Correct node and connect OutColor of Sub dermal Texture node to Value of Gamma correct node. Use the Gamma values to make the map values look yellowish in color. This will be our fat layer which goes into SSS 3 Color.

Now create a remap node to the sub dermal texture node and use the RGB curves to create a deep contrast of Red and Yellow on the map:

Then, use a Multiply and Divide node to Multiply both RemapColor and Gamma correct nodes to get the balance of both texture colors for the Epidermal layer, which goes into SSS 2 Color.

To control the SSS scale on the skin, I paint a black and white map in Mari and plug that into SSS Mix.

Skin Dirt Surface Detail

Export the color of the dirt as a solid color from Mari and all the paint detail as an RGB map.

We now use the RGB mask map to reveal the color on the skin. This way, you can control the dirt amount on the skin within Maya without needing to go back into Mari.

Create a File texture node and load the RGB mask, then create a Remap HSV node too. Since the blue channel contains the information of the dirt, we need to isolate the blue channel to reveal the dirt. So, create a RemapValue node and connect Out Color B from Remap HSV to Input Value of RemapValue node. You can the use the ram in the RemapValue node to control the dirt amount. This same process can be used for scars, tattoos, war paint etc.

Create a Vray Mtl and conncet the dirt color to Diffuse and RemapValue to Opacity map then create a VrayBlendMtl node and connect the Skin shader to Base Material and Dirt Material go into Coat Material 0.

Ornatrix for Realistic Hair

Ornatrix is a user-friendly Hair and Feather generator you can find. It is very stable and easy to use. One of the many good things about Ornatrix is that it identifies multiple UV tiles, which is very helpful to mask the hair and also use masks to control height randomization. Ornatrix offer very stable and controlled grooming tools, but i personally prefer drawing curves to stylize the hair in a more controlled way. For this particular project i sculpted the hairstyle in ZBrush and then used it as a base to draw the curves.

To have more control over the groom and stylizing the hair I personally prefer generating the hair separately for scalp, beard, mustache etc.

Select the Beard curves and open “Add Hair to Selection” from Ornatrix tool bar, then select Hair From Curves. This will create a “Guides from Curves Node” and “Ground Strands Node” in the Operator stack of Ornatrix. Select the “GuidesFromCurvesNode” and increase the Point Count of the guides to have a smooth curve. Then in “GroundStrandsNode” click on Set Distribution Mesh and select the face mesh in the viewport, then click on Ground Strands.

Now create a “Hair from Guides Node”. To generate the hair, I then plugin the Distribution map that I created in Mari to Distribution Multiplier, as this map will dictate where the hair should be generated on the mesh. You can then set the Render count to the number you feel right. In this case, I used 90,000. These 90,000 strands will only show up in the render and you can control the number of hair strands on the viewport in Viewport Count. I’d like to keep this number low just so my view port doesn’t get too heavy.

If you want to further groom the guides, create “EditGuidesShape” and place it under the “HairFromGuidesNode”. (It is very crucial where you place the nodes because the nodes take the info from the nodes benath them.) Then by using the wide range of grooming tools, you can play around until you get the desired look.

I then used other stylizing nodes such as LengthNode, HairClusterNode, CurlNode, GravityNode and FrizzNode to give a sense of randomness to the hair. These nodes are very straight forward so you just need to play around with the values and have fun with it. Finally, go to the renderSettingsNode and set the radius of the hair and set the shape of the hair strand using the Radius Ramp. (The radius usually varies based on the scale of your model).

Shading Hair

Create a VRay Hair Mtl and apply it to the Ornatrix nodes in the outliner.

Then create a VRayHairSampler node, this will control the color distance and randomization. Now create two gradient nodes, one for color of the hair and the other to control the color from root to tip of the hair. Open the Strand colors node and set different color variations, because hair has different color variations if you observe closely, specially for aging people. So, we want all the colors in this gradient to be randomly applied to the hair strands hence connect RandomByStrand from the VRayHairSamplerto the V Coord of strandColors.

To control the color of each strand from Root to tip connect DistanceAlongStrand  to the V Coord of the StrandGradiant node. Now create a BlendColor node to blend the color gradients before connecting to the hair Mtl. Depending on how the colors should be revealed connect the gradients to Color 1 and Color 2, then connect the Random by strand from VRay hair sampler to the Blender.  

And there you have it!

Final Render


About the author

Sierra is the Editor of ArtStation Magazine.