# Principled Hair BSDF¶

The *Principled Hair* BSDF is a physically-based,
easy-to-use shader for rendering hair and fur.

## Coloring Hair¶

The shader provides three different ways, or *parametrizations*, to color the hair strands.

- Direct coloring
- Choose the desired RGB color and the shader will approximate
the necessary
*absorption coefficient*(below). - Melanin concentration
This mode defines the color as the quantity and ratio of the pigments which are commonly found in hair and fur,

*eumelanin*(prevalent in brown-black hair) and*pheomelanin*(red hair). The quantity is specified in the*Melanin*input, and the ratio between them in*Melanin Redness*. Increasing concentrations darken the hair (the following are with*Melanin Redness*\(1\)):- White (Melanin \(0\)),
- Blonde (Melanin \(0.25\))
- Reddish (Melanin \(0.5\))
- Brown (Melanin \(0.75\))
- Black (Melanin \(1\))

Additionally, the

*Tint*inputs allows to dye the hair with the desired color.- Absorption coefficient
- Specifies the attenuation coefficient \(\sigma_{a}\), as applied by the Beer-Lambert law. This mode is intended mainly for technical users who want to use coefficients from the literature without any sort of conversion.

## Randomizing Properties¶

Realistic hair should have a minimum of variance between each strand.
The shader allows for this by specifying two values, *Random Color*
and *Random Roughness*, which remap the specified Melanin/Roughness
values to the range \(Color/Roughness \pm Randomization\%\).

## Inputs¶

- Color
The RGB color of the strand. Only used in Direct coloring.

Dica

The chosen color is converted to an absorption coefficient with the following formula (section 4.2 of [CBTB16]):

\[\sigma_{a} = \frac{\ln(Color)} {\left(5.969 - 0.215\beta_{N} + 2.532\beta_{N}^{2} - 10.73\beta_{N}^{3} + 5.574\beta_{N}^{4} + 0.245\beta_{N}^{5}\right)^{2}}\]where \(\beta_{N}\) is the radial roughness of the hair after applying randomization (if specified).

- Melanin
Absolute quantity of pigment. Range \([0, 1]\) equivalent to \([0\%, 100\%]\).

Dica

This is a linear mapping to the underlying exponential function:

\[melanin\_qty = -\ln(\max(1.0 - Melanin, 0.0001))\]

- Melanin Redness
Ratio of pheomelanin to eumelanin. Range \([0, 1]\) equivalent to \([0\%, 100\%]\).

Dica

The ratio formula is: \(eumelanin = Melanin*(1.0-MelaninRedness)\), \(pheomelanin = Melanin*MelaninRedness\).

The resulting quantities are converted (after randomization, if specified) to absorption concentration via the following formula (section 6.1 of [EFHLA11], adjusted for the range \([0, 1]\)):

\[\begin{split}\sigma_{a} = eumelanin * \left[\begin{matrix} 0.506 \\ 0.841 \\ 1.653 \\ \end{matrix}\right] + pheomelanin * \left[\begin{matrix} 0.343 \\ 0.733 \\ 1.924 \\ \end{matrix}\right]\end{split}\]

- Tint
Color used for dyeing the hair after applying the melanin pigment. It is not subject to randomization. It can be disabled by setting the color to white.

Dica

This is converted via the Color mapping above and added to the absorption coefficient of the melanin concentration.

- Absorption coefficient
- Attenuation coefficient \(\sigma\).
- Roughness
- Specify how much the glints are smoothed in the direction of the hair shaft. Too low values will smoothen the hair to the point of looking almost metallic, making glints look like fireflies; while setting it too high will result in a Lambertian look.

- Radial Roughness
Specify how much the glints are smoothed in the direction of the hair tangent. Too low values will concentrate the glint; while setting it too high will spread the light across the width of the strand.

Dica

Mathematically, this parameter is mapped to the logistic distribution’s scale factor \(s\) (section 4.1 of [CBTB16]).

- Coat
- Simulate a shiny coat of fur, by reducing the Roughness to the given factor only for the first light bounce (diffuse). Range \([0, 1]\) equivalent to a reduction of \([0\%, 100\%]\) of the original Roughness.

- IOR
- Index of refraction (IOR) defining how much the ray changes direction. At 1.0 rays pass straight through like in a transparent material; higher values give more refraction. Default value is \(1.55\).
- Offset
- Tilts the glint of the hair by increasing the angle of the scales of the hair’s cuticle with respect to the hair shaft. Human hair usually has low values.
- Random Color
For each strand, vary the melanin concentration by \(RandomFactor\). Range \([0, 1]\) equivalent to \([0\%, 100\%]\) of the initial melanin concentration.

Dica

The melanin concentration is multiplied by \(randomFactor\), where \(randomFactor = 1.0 + 2.0*(Random - 0.5) * RandomColor\).

- Random Roughness
For each strand, vary both Roughness values by \(RandomFactor\). Range \([0, 1]\) equivalent to \([0\%, 100\%]\) of the initial roughness values.

Dica

The applied formula is the same one as for

*Random Color*.

- Random
- Random number source. If no node is connected here, it is automatically instanced with the value obtained from .

## Properties¶

- Parametrization
- Choose one of the three coloring modes described above.

## Outputs¶

- BSDF
- Standard shader output.

## References¶

This shader is an implementation of the paper by Chiang et al. [CBTB16],
which was used in the Disney film, «Zootopia»^{®}.

[CBTB16] | (1, 2, 3) Chiang, M. J. , Bitterli, B. , Tappan, C. and Burley, B. (2016),
A Practical and Controllable Hair and Fur Model for Production Path Tracing. Computer Graphics Forum, 35: 275-283.
doi:10.1111/cgf.12830 |

[EFHLA11] | d’Eon, E. , Francois, G. , Hill, M. , Letteri, J. and Aubry, J. (2011), An Energy‐Conserving Hair Reflectance Model. Computer Graphics Forum, 30: 1181-1187. doi:10.1111/j.1467-8659.2011.01976.x |