|On this page|
Karma Hair is a physically-based material for rendering hair and fur, based on the model from Chiang et al for Zootopia. The model is very efficient, even for a path tracing renderer. The material has artistic controls based on the physical responses of hair fibers in nature.
The material shades fibers as if they tubes of rough glass, where light scatters within the hair like it does in nature. In the image below, a curve with the hair material is next to a hair shaped polygonal tube with the Principled material with transmission on:
You can see on the right side of the image that the hair material on a curve gives a very close approximation of the look of the transmissive polygonal surface with actual thickness.
It’s Karma (Houdini’s USD renderer) that creates the “thickened” tube around hair curves at render time, not the shader. Technically, you could shade hair with a regular glass shader similar to the one used on the polygonal tube in the images above. However, this material is much faster at shading hair than a generic shader.
is the natural pigment that affects hair color. This material has melanin-based controls to achieve natural-looking hair colors (as well as overrides to choose other hair colors). There are two types of melanin: eumelanin colors blond/brown/black hair, and pheomelanin colors red hair. The Melanin Redness parameter blends between blond/brown/black (
0.0) and red (
Each of the following looks uses different Melanin, Melanin Redness, Melanin Randomize, and Thickness Scale values.
(This image shows melanin and thickness values decreasing from left to right.)
You may need to decrease the Ray Bias in the Karma Render Properties if strands don’t look wide enough.
When the ray bias is too large, the transparency will stop at a certain point along the curve, leaving thin portions of the curve black.
If you want to see the thin, tapered ends of hairs but they look too thick, try increasing the number of Pixel samples in the Karma Render Properties.
For close-up hair or fur, edit your hair curve geometry using the Basis Curves LOP to set the following properties:
Smoothly interpolates between curve segments
Uses BSpline interpolation method
Creates phantom points if necessary, for the cubic curve to be valid.
A “lightness” scale on the hair color, from black to the base/melanin color.
The base color of the hair. To use the melanin controls (below) to get a natural hair color, set this to
1, 1, 1 (white, the default). To use this color without melanin influence, set the Melanin parameter below to
0. If you set this color and use the melanin controls, this color acts like hair dye.
Amount of natural pigment in the hair (note that increasing this parameter darkens the hair). Assuming the default Base Color (white), this blends between white, platinum blond, blond, brown, and black.
The amount of red in the natural pigment. The red contribution is scaled by the total amount of pigment (the Melanin parameter). High redness with relatively low melanin gives a “honey blond” look. For true red hair set this to
1 and the amount of melanin around
0.5 or higher.
How much to randomize the melanin level of each hair strand. This helps make the hair look less uniform and more natural.
(You can change the Random Seed on the Advanced tab.)
Changes the hair color based on how real hair changes with strand thickness. Lower (thinner) values makes the color closer to white because the hairs scatter less light. The default is
1. This does not change the actual thickness of the rendered hair tubes (to change the actual thickness, change the
width attribute on the hair curve geometry).
A multiplier on the final lighting result.
The cuticle angle: where the primary reflected specular highlight appears along the hair strand. Values from
1 in this parameter represent
90 degrees across the hair width. Default is
index of refraction
of the hair. This controls how much light the hair absorbs versus how much it reflects. Lower values scatter more light forward (away from the light source), higher values reflect more light backward (back toward the light source). An IOR of
1 represents full transparency. The default is
Lower values give shinier hair, higher values give duller hair. (When Roughness anisotropic is on, this controls the longitudinal roughness, along the length of the hair.)
How much to randomize the roughness of each hair strand. This helps make the hair look less uniform and more natural.
(You can change the Random Seed on the Advanced tab.)
When this is off (the default), the Roughness parameer above controls both longitudinal (along the length of the hair) and azimuthal (across the width of the hair) roughness. You can turn this on to get a separate control for azimuthal roughness.
When Roughness Anisotropic is on, this controls the azimuthal (across the width of the hair) roughness. Lower azimuthal roughness values allow light to travel through the hair more easily. Higher azimuthal roughness values causes light to bounce around more within the hair.
Shininess of the outer layer of the hairs. Higher values give a stronger glint contrast when the hair reflects light. This can make the hair look wet or oily.
The amount of diffuse reflectance. Increasing this slightly can make the hair look dirty or damaged by decreasing the apparent shininess. Non-zero values move the hair color toward the Diffuse Color below. This is not physically realistic (real hair does not have a diffuse component) but may be useful for artistic control.
Diffuse reflectance color. Non-zero values of the Diffuse scale above add this color to the hair color. This is not physically realistic (real hair does not have a diffuse component) but may be useful for artistic control.
Custom Hair ID
Normally, the material calculates a unique Hair ID for each strand based on the curve or prim ID. If you turn this on, you can wire nodes into this node’s Hair ID input to calculate a Hair ID for each strand. Strands with the same Hair ID get the same “random” result where the material uses randomness (Melanin Randomize, Roughness Randomize).
This is a parameter equivalent of the node’s Hair ID input. You should use the input to calculate a Hair ID for each strand, rather than using this parameter. If you use this parameter instead of wiring into the input, every strand will get the same “random” values for melanin and roughness, which will look strange.
Different values give different results where the material uses randomness (Melanin Randomize, Roughness Randomize).