Advanced Realistic Hair in Blender (Patreon)
Content
Following up on my article about the great hair and fur tools in Blender, I wanted to dive deeper into getting very realistic results. There are number of important considerations when working towards that goal, so let’s get started!
Reference Images
Choosing good reference images and knowing what to look for is a crucial starting point. Many times when creating realistic hair or fur you’ll be presented with a specific person or animal to replicate, perhaps with the aim of creating a digital double. In that case you’ll likely have a large number of reference images to choose from. For this sample project I wanted something that would be simple but provide a lot of opportunities for technical discussion. I found this image of an eyebrow from Getty Images and thought it was a perfect subject:
The more images you have from different angles, the better. One pitfall when working from a single image is that it gives no clues about how the hair looks for the top, bottom or sides. When working in 3D it’s entirely possible to come up with something that looks like a perfect match from the front, but then from the side is all wrong.
Since the image I chose for this demo is only from the front, I looked around for similar highly groomed female eyebrows from other angles to give myself a good sampling to work from.
Once we’ve got a stable of references, the next step is to observe the details and study how the various parts of the subject work together. Careful inspection yields a number of observations:
There is a primary set of brow hairs that make up the majority of the look.
There is a secondary, finer set of hairs that form an upper “border” to the brow.
The main brow hairs are melanin-heavy, with a strong red tint.
There is fine “fuzz” on the skin that is a different melanin content compared to the main hairs.
The main brow hairs to the left are mostly vertical and the rest of the brow is brushed to the right.
This is a highly groomed brow, with a particularly well-defined bottom edge.
There is slightly less density on both the right and left sides.
The length of the hairs vary in different parts of the brow.
There is a large amount of clumping, probably due to cosmetics.
Looking at top or side views we can see that brow hairs usually conform closely to the contour of the skin, especially in a case where cosmetics and a brush have been used.
Keeping all these points in mind will keep us focused on what work needs to be done.
Setting up the Hair in Blender
As noted at the start, I’ll be using Blender for this project since it expands nicely on my last article and also showcases the great results that are possible with Blender. However, this hair/fur workflow will apply to any other app. I’ll be glossing over the details of each task, but you can refer to the last article for step-by-step instructions.
Since there are three “zones” in the main reference image, I created three separate hair containers on my high resolution brow mesh: the main brow, the fine upper border hairs, and the fuzz.
I started work with the main brow. I created a small number of hairs in the general outline of the shapes I saw: relatively vertical hairs to the left, transitioning to somewhat wavy, horizontal hairs for the rest of the brow. I combed the guides into position, then added an Interpolate Hair Curves modifier to populate the mesh with more hairs. This also necessitated painting a vertex density mask so that the hairs didn’t cover the entire forehead. I applied the modifier so that I could have complete control over the new set of guides. In Blender you can’t slide, add or delete hairs very effectively when there’s an active interpolate modifier.
I moved hairs around to demarcate the bottom edge, added new ones to fill in missing areas, refined the combing and modified the lengths as needed. The hairs on the left and middle are longer in the reference image, tapering off to short on the far right.
I added another interpolate modifier to get the hair count up to approximately the final amount, editing the mask to thin out the density on the left and right.
By this point I had just about the right overall density, so I applied the interpolate modifier once again to give myself a nearly complete, fully editable set of hairs. I used the add and slide brushes liberally, continuing to comb as needed, often selecting individual hairs or small groups. You can select this way using the Selection Paint tool and clicking the Set Select Mode: Curve icon.
Simply click a single hair and it will be the only one selected, or click and drag to select several. This lets you easily target your modifications without disturbing anything else.
I followed a similar process to create the fine upper border hairs and the fuzz. Both of these were much simpler. I used interpolation modifiers with appropriate density masks to quickly fill in hairs, then applied the modifiers and continued to edit as needed.
Make sure to keep looking at your work from all angles! It’s easy to have the hairs angling too much away from the skin.
Natural Randomization
Arguably the most important step in creating a realistic results is to include a large amount of controlled randomness. The illusion is ruined if you have, for example, a lot of hairs aligned in perfect parallel or all the exact same length. Machines are organized and regular, organic forms are not.
Looking at reference images it’s fair to say that in real life almost every single hair is slightly different, especially with regards to length and shape. We’ll set a different radius for each of our hair containers, but it’s ok to keep the same radius on each hair within a container. The level of variation there in real life is so microscopic as to not be worth bothering with.
To illustrate how random organic forms tend to be, let’s look at one part of our reference image in isolation. It’s easy to see that the hairs on the left are all generally oriented in the same direction. But, look more closely and there is actually an incredible amount of variation. Almost every hair is a slightly different length. The curvature of each, while similar, tends to diverge, especially at the tips. Also, the origin point of each hair is unevenly distributed.
If we combed the entire left side area with a single motion and called it a day the result would look “fake.”
It’s this level of randomness that makes or breaks the look of CG hair. Take your time and adjust each hair individually or in small groups. Note that frizz/noise and clump modifiers can do some of the randomization heavy lifting so you don’t have to go hair by hair.
I found that clumping was nicely random on its own and that took care a lot of the look I was after. I could then slightly modify the clumps by hand to give them a final touch of polish.
Now that we’ve got a (mostly) complete look, let’s move on to making pretty pictures!
Lookdev and Rendering
I used Cycles to create a quick render to refer to as I worked. Cycles is fine, but I definitely felt something was missing. The hair looked slightly “plastic.” I was able to get a general idea of how things looked, but Cycles wasn’t getting me all the way there.
Since RenderMan has great Blender support (including for Geometry Nodes-based hair) and I moved over to it for the final render. This was a great choice!
Before continuing, I should mention that I created a very high resolution skin mesh with pores crafted in ZBrush. Nothing fancy, and not a finished product on its own, just enough to provide a realistic backdrop for the main attraction, the hair. I decided to sculpt the pores on a high resolution mesh just to avoid the annoyance of baking or painting a displacement map and creating a shader for that. It was much easier in this case to have a couple million poly skin mesh with a simple SSS material applied. I used FlippedNormals Skin Kit for the ZBrush skin pore alpha.
I also painted a quick skin texture in Substance Painter using projection painting with a freckled skin image I found online.
I painted just using the cheek area of the stencil with different zooms and rotations and low flow to fill the whole surface with the same controlled randomness approach as used for the hair. This only took a couple of minutes in SP and the results were worth it.
With the skin taken care of, hair time! The main brow and the upper edge both use the same material with a high melanin concentration and high redness. The fuzz is a different material with almost no melanin.
RenderMan’s Marschner Hair shader is easy to set up. You can leave all the roughness and other settings at default most of the time. The important part is to attach a Pxr Hair Color to the relevant inputs and dial in the melanin concentrations as needed.
I was blown away by how spectacular RenderMan looks in the final ender. It’s probably the best hair shader I’ve ever worked with, incredibly photoreal out of the box. Cycles can’t compete.
As part of the process of creating the final image I rendered out what I had at any given time and glanced at it over hours and days, making notes of things I wasn’t quite happy with. This often resulted in adjusting the underlying groom as I noticed small details that I wasn’t happy with. Most of the time these were issues with not enough subtle randomness. A few small touches with the comb brush, selecting individual hairs as needed, was usually enough to break up the structure and provide a thoroughly natural look.
Last but not least, another pitfall of CG is that renders are often too “perfect.” If our goal is to match the look of a still or film camera, then there will be blur and distortion from the camera optics. A quick pass with Photoshop’s blur brush will help, or you can use your renderer’s built in depth of field settings. If this is part of a larger portrait that will only be seen from a distance then it doesn’t matter too much. But, in this case, an extreme closeup, it might be good to spend some time “de-perfecting” the render.
Final Notes
I hope this article gives you a solid foundation to build your own realistic hair and fur. You can’t go wrong if you start from a great set of workflow principles and take the time to patiently reflect upon and examine your work. It’s a fun and satisfying process!
As I said, everything here applies to any CG app’s hair and fur workflow, but I think Blender really excels. Its tools are comprehensive and powerful, it never crashes, and it’s just generally a pleasure to use from start to finish. I highly recommend Blender for this kind of project!