Name | Car Paint | Metal
--------------------|:----------------------------------------------------:|:-----------------:
| ![](img/subtypes_carpaint.png width="130px") | ![](img/subtypes_metal.png width="130px")
Albedo | (0.009,0.013,0.028) | (0.5,0.5,0.5)
Metallic | *1* | *1*
Roughness | 0.4 | 0.1
Anisotropy | *0* | 0
Anisotropy Rotation | *0* | 0
Normal | *(0,0,1)* | (0,0,1)
Transparency | *0* | *0*
Cut-Out Opacity | 1 | 1
Specular | *1* | *1*
Specular Tint | *(1,1,1)* | *(1,1,1)*
Flake Coverage | 0.8 | *0*
Flake Color | (0.49,0.180,0.3537) | *(1,1,1)*
Flake Size | 0.05 | *0*
Flake Roughness | 0.25 | *0*
Clearcoat | 1 | *0*
Clearcoat Roughness | 0 | *0*
Clearcoat Normal | (0,0,1) | *(0,0,1)*
[Table [subtypes-parameters-metals]: List of metallic material subtypes (metallic = 1).]

Name | Emissive | Textile | Wood |
--------------------|:------------------------------------------------:|:-------------------------------------------------:|:------------------------------------------:|
| ![](img/subtypes_emissive.png width="130px") | ![](img/subtypes_textileleather.png width="130px")| ![](img/subtypes_wood.png width="130px") |
Albedo | *(0,0,0)* | (0.302,

0.294,

0.236) | (0.344,

0.227,

0.07) | Metallic | *0* | *0* | *0* | Roughness | *0* | 0.4 | 0.5 | Anisotropy | *0* | *0* | *0* | Anisotropy Rotation | *0* | 0 | 0 | Normal | *(0,0,1)* | (0,0,1) | (0,0,1) | Transparency | *0* | 0 | 0 | Cut-Out Opacity | 1 | 1 | 1 | Specular | *0* | *1* | *1* | Specular Tint | *(0,0,0)* | *(1,1,1)* | *(1,1,1)* | Sheen | *0* | 0.3 | *0* | Sheen Color | *(1,1,1)* | (0.844,

0.82,

0.666) | *(1,1,1)* | Sheen Roughness | *0.3* | 0.3 | *0.3* | Clearcoat | *0* | *0* | 1 | Clearcoat Roughness | *0* | *0* | 0 | Clearcoat Normal | *(0,0,1)* | *(0,0,1)* | (0,0,1) | Emission Color | (0.5,

0.442,

0.298) | *(1,1,1)* | *(1,1,1)* | Emission Value | 10 lx | *0 lx* | *0 lx* | Energy Norm. | false | *false* | *false* | Thin Walled | *true* | *true* | *true* | Index of Refraction | *1.5* | *1.5* | *1.5* | [Table [subtypes-parameters-opaque-dielectrics]: List of non-volumetric dielectric material subtypes (metallic = 0).]

0.294,

0.236) | (0.344,

0.227,

0.07) | Metallic | *0* | *0* | *0* | Roughness | *0* | 0.4 | 0.5 | Anisotropy | *0* | *0* | *0* | Anisotropy Rotation | *0* | 0 | 0 | Normal | *(0,0,1)* | (0,0,1) | (0,0,1) | Transparency | *0* | 0 | 0 | Cut-Out Opacity | 1 | 1 | 1 | Specular | *0* | *1* | *1* | Specular Tint | *(0,0,0)* | *(1,1,1)* | *(1,1,1)* | Sheen | *0* | 0.3 | *0* | Sheen Color | *(1,1,1)* | (0.844,

0.82,

0.666) | *(1,1,1)* | Sheen Roughness | *0.3* | 0.3 | *0.3* | Clearcoat | *0* | *0* | 1 | Clearcoat Roughness | *0* | *0* | 0 | Clearcoat Normal | *(0,0,1)* | *(0,0,1)* | (0,0,1) | Emission Color | (0.5,

0.442,

0.298) | *(1,1,1)* | *(1,1,1)* | Emission Value | 10 lx | *0 lx* | *0 lx* | Energy Norm. | false | *false* | *false* | Thin Walled | *true* | *true* | *true* | Index of Refraction | *1.5* | *1.5* | *1.5* | [Table [subtypes-parameters-opaque-dielectrics]: List of non-volumetric dielectric material subtypes (metallic = 0).]

Name | Glass | Plastic |
--------------------|:-----------------------------------------------:|:---------------------------------------------------:|
| ![](img/subtypes_glass.png width="130px") | ![](img/subtypes_plastic.png width="130px") |
Albedo | (1,1,1) | (0.004,

0.004,

0.004) | Metallic | *0* | *0* | Roughness | 0 | 0.25 | Anisotropy | *0* | *0* | Anisotropy Rotation | *0* | *0* | Normal | (0,0,1) | (0,0,1) | Transparency | *1* | 0 | Cut-Out Opacity | 1 | 1 | Specular | *1* | *1* | Specular Tint | *(1,1,1)* | *(1,1,1)* | Thin Walled | false | true | Index of Refraction | *1.5* | 1.5 | Attenuation Color | (0.99,

0.99,

0.99) | (1,1,1) | Attenuation Distance| 5 mm | 0.01 mm | Subsurface Color | *(0,0,0)* | (0,0,0) | [Table [subtypes-parameters-transparent-dielectrics]: List of transparent dielectric material subtypes.]

0.004,

0.004) | Metallic | *0* | *0* | Roughness | 0 | 0.25 | Anisotropy | *0* | *0* | Anisotropy Rotation | *0* | *0* | Normal | (0,0,1) | (0,0,1) | Transparency | *1* | 0 | Cut-Out Opacity | 1 | 1 | Specular | *1* | *1* | Specular Tint | *(1,1,1)* | *(1,1,1)* | Thin Walled | false | true | Index of Refraction | *1.5* | 1.5 | Attenuation Color | (0.99,

0.99,

0.99) | (1,1,1) | Attenuation Distance| 5 mm | 0.01 mm | Subsurface Color | *(0,0,0)* | (0,0,0) | [Table [subtypes-parameters-transparent-dielectrics]: List of transparent dielectric material subtypes.]

Name | Basic |
--------------------|:-------------------------------------------------:|
| ![](img/subtypes_basic.png width="130px") |
Albedo | (0.284,

0.284,

0.284) | Metallic | 0 | Roughness | 0.3 | Anisotropy | 0 | Anisotropy Rotation | *0* | Normal | (0,0,1) | Transparency | *0* | Cut-Out Opacity | 1 | Specular | *1* | Specular Tint | *(1,1,1)* | Sheen | *0* | Sheen Color | *(1,1,1)* | Sheen Roughness | *0.3* | Clearcoat | *0* | Clearcoat Roughness | *0* | Clearcoat Normal | *(0,0,1)* | Emission Color | *(1,1,1)* | Emission Value | *0 lx* | Energy Norm. | *false* | Thin Walled | *true* | Index of Refraction | *1.5* | [Table [subtypes-parameters-basic]: Parameters of the Basic subtype.]

Design Rationale
================
The Enterprise PBR Shading Model is the basis for a large variety of use-cases, ranging from high-performance VR applications to high-quality offline GI renderings. However, it is not expected that it will cover all use-cases one can imagine, but it should be sufficient for day-to-day use. This requires some tradeoffs, which are based on the following guidelines and requirements.
Most important, the material should be *easy to use* for inexperienced users, but still powerful enough for trained artists in real-time rendering and global illumination. For this reason, the material has only a small amount parameters, following industry-standard workflows known from real-time engines (Unreal Engine 4, Unity Engine) and movie production (Disney BRDF). Using the *metallic/roughness workflow*, it is possible to create a wide variety of materials using only a subset of the complete parameter set, namely albedo, metallic, roughness and normal map. Another aspect is the fact that it allows users to parameterize materials in a way that they are *physically-based by default*, but can be tweaked when needed for more artistic freedom using parameters like specular tint and specular. Most parameters are linear and texturable, so that *layering via parameter blending* is possible. Notable exceptions are parameters affecting the volume, because there are no texture coordinates available inside an object.
Especially for GI renderers, there are certain physical and mathematical properties that materials or BSDFs must fullfill. A BSDF must obey the *Helmholtz reciprocity* (for bidirectional rendering methods), be *positive* and *energy conserving* (for fast convergence).
*Performance in real-time rendering* is a critical aspect. Most parameters do not influence each other or have a clearly defined state in which an effect is disabled, making it possible to specialize shader code for certain use-cases. Clearly, offline GI rendering also profits from this, but besides that it is also important to choose BSDFs that can be *sampled efficiently*, like the GGX microfacet model.
As many software packages offer a unified interface to different renderers, *consistency across renderers* and rendering-algorithms is another key requirement for the material. A material prepared in one renderer, for example in GI, should look the same in other renderers, for example in a rasterizer. As this is not always possible, because some effects like refraction or brute-force subsurface scattering are impossible in a real-time rasterizer, the *rasterizers will approximate* the *ground-truth GI solution*. The material is defined in a way that it encourages approximations wherever possible.
Not all real-world effects can be rendered with the Enterprise PBR Shading Model. Especially for high-quality renderings or light simulation, artists and engineers need more flexbility. Other material systems like [Open Shading Language (OSL)](https://github.com/imageworks/OpenShadingLanguage) from Imageworks or [Material Definition Language (MDL)](http://mdlhandbook.com/) from NVIDIA allow users to build their own materials from basic building blocks structured as a node graph. The [Appearance Exchange Format (AxF)](https://www.xrite.com/axf) from X-Rite stores results from a capturing process using their material scanners. Such material systems and models are projected onto the parameters of the Enterprise PBR Shading Model via *fitting* (or *distilling*).
Changelog
=========
Version 2021x
-------------
* Added displacement mapping.
* Added translucency.
* Changed sheen effect. The new effect is based on the "Charlie" Sheen BRDF, layered on top of core material via albedo-scaling [#CK17].
* Added an alternative visibility term for the "Charlie" Sheen BRDF [#NP13].
* Emission is now below clearcoat in the layering stack.
* Added Henyey-Greenstein phase function for volume scattering [#HG41].
* Added flakes layer.
Version 2019x
-------------
* Initial version.
Appendix
========
Combining Metallic and Dielectric BSDFs
---------------------------------------
The core of the Enterprise PBR Material is a weighted sum of three BSDFs, the metallic BSDF, the opaque dielectric BSDF and the transparent dielectric BSDF. The similarity between the BSDFs allows us to simplify the material significantly. We start from the sum of the three BSDFs:
\begin{eqnarray}
&\text{ThinCore}(\rho, s, \eta, \rho_s) &=&\\
&&m & \text{Metallic}(\rho) \nonumber\\
&+&(1-m)(1-t) & \text{OpaqueDielectric}(\rho, s, \eta, \rho_s) \nonumber\\
&+&(1-m)t & \text{ThinTransparentDielectric}(\rho, s, \eta, \rho_s) \nonumber
\end{eqnarray}
Note that we omitted some parameters here to make the equations shorter. These do not influence the weighting.
\begin{eqnarray}
\text{ThinCore}(\rho, s, \eta, \rho_s) &=& \text{ThinCore}(\mathbf{v}, \mathbf{l}; r_u, r_v, \rho, s, \eta, \rho_s, l) \\
\text{Metallic}(\rho) &=& \text{Metallic}(\mathbf{v}, \mathbf{l}; r_u, r_v, \rho) \\
\text{OpaqueDielectric}(\rho, s, \eta, \rho_s) &=& \text{OpaqueDielectric}(\mathbf{v}, \mathbf{l}; r_u, r_v, \rho, s, \eta, \rho_s, l) \\
\text{ThinTransparentDielectric}(\rho, s, \eta, \rho_s) &=& \text{ThinTransparentDielectric}(\mathbf{v}, \mathbf{l}; r_u, r_v, \rho, s, \eta, \rho_s)
\end{eqnarray}
Substituting all terms leads to
\begin{eqnarray}
&\text{ThinCore}(\rho, s, \eta, \rho_s) &=& \\
&&m & M_r \, F(\cos\theta_r; \rho, 1) \nonumber\\
&+&m & M_{r,ms} \, F_{ms}(\rho, 1) \nonumber\\
&+&(1-m)(1-t) & \rho \, B(\mathbf{v}, \mathbf{l}; s, F_0, \rho_s) \nonumber\\
&+&(1-m)(1-t) & s\,M_r \, F(\cos\theta_r; F_0 \rho_s, 1) \nonumber\\
&+&(1-m)(1-t) & s\,M_{r,ms} \, F_{ms}(F_0 \rho_s, 1) \nonumber\\
&+&(1-m)t & s \, M_r \, F(\cos\theta_r; F_0 \rho_s, 1) \nonumber\\
&+&(1-m)t & \rho\,{M_r}^\prime \, (1 - s \, F(\cos\theta_r'; F_0 \rho_s, 1)) \nonumber\\
&+&(1-m)t & s\,M_{r,ms} \, F_{ms}(F_0 \rho_s, 1) \nonumber \\
\end{eqnarray}
and after rearranging we get
\begin{eqnarray}
&=&& M_r \left[
m \, F(\cos\theta_r; \rho, 1) +
(1-m) (1-t) s \,F(\cos\theta_r; F_0 \rho_s, 1) +
(1-m) t s \, F(\cos\theta_r; F_0 \rho_s, 1)
\right] \nonumber\\
&&+& M_{r,ms} \left[
m \, F_{ms}(\rho, 1) +
(1-m) (1-t) s \, F_{ms}(F_0 \rho_s, 1) +
(1-m) t s F_{ms}(F_0 \rho_s, 1)
\right] \nonumber\\
&&+& (1-m)t \rho\,{M_r}^\prime \, (1 - s \, F(\cos\theta_r'; F_0 \rho_s, 1)) \nonumber\\
&&+& (1-m)(1-t) \rho \, B(\mathbf{v}, \mathbf{l}; s, F_0, \rho_s)
\end{eqnarray}
With the Schlick approximation for the Fresnel term
\begin{equation}
F(\cos\theta,f_0,f_{90}) = f_0 + (f_{90} - f_0) (1 - \cos\theta)^5
\end{equation}
the following properties hold
\begin{eqnarray}
a \, F(\cos\theta,f_0,f_{90}) &=& F(\cos\theta, a \, f_0, a \, f_{90}) \\
F(\cos\theta, a, b) + F(\cos\theta, c, d) &=& F(\cos\theta, a+c, b+d)
\end{eqnarray}
Approximately, that is also the case for the multi-scattering Fresnel $F_{ms}$, so we assume
\begin{eqnarray}
a \, F_{ms}(f_0,f_{90}) &\approx& F_{ms}( a \, f_0, a \, f_{90}) \\
F_{ms}(a, b) + F_{ms}(c, d) &\approx& F_{ms}(a+c, b+d)
\end{eqnarray}
This allows us to simplify the combined BSDFs and we arrive at the final form:
\begin{eqnarray}
\text{ThinCore}(\rho, s, \eta, \rho_s)&=&& M_r F(\cos\theta_r; (1-m) s F_0 \rho_s + m \rho, (1-m)s + m) \nonumber\\
&&+& M_{r,ms} F_{ms}((1-m) s F_0 \rho_s + m \rho, (1-m)s + m)) \nonumber\\
&&+& (1-m)t \rho\,{M_r}^\prime \, (1 - s \, F(\cos\theta_r'; F_0 \rho_s, 1)) \nonumber\\
&&+& (1-m)(1-t) \rho \, B(\mathbf{v}, \mathbf{l}; s, F_0, \rho_s)
\end{eqnarray}
Energy Compensation
-------------------
### Multiple-Scattering GGX BRDFs
The GGX microfacet BRDF $M_r(\mathbf{v},\mathbf{l}; r_u, r_v)$ only models a single scattering event, which is the first reflection that occurs at a facet on the microsurface. Multiple bounces between the facets are ignored, effectively leading to too much absorption in the model. [#KC17] describes a method to approximate the missing contribution from multiple scattering. It requires directional and average albedo of the single-scattering model. We precompute those values and store them in a lookup table. In this section we describe how the precomputation step works.
In [#KC17], the missing energy due to the missing multiple-scattering in the GGX microfacet model $M_r$ is approximated by adding an additional compensation term $M_{r,ms}$. We will call the sum $F_{r, 1}$:
\begin{eqnarray}
F_{r, 1}(\mathbf{v},\mathbf{l}; r_u, r_v) &=& M_r(\mathbf{v},\mathbf{l}; r_u, r_v) + M_{r,ms}(\mathbf{v},\mathbf{l}; r_u, r_v) \\
&=& M_r(\mathbf{v},\mathbf{l}; r_u, r_v) + \frac{(1 - E_m(\mathbf{v}\cdot\mathbf{n}; r_{uv}))(1 - E_m(\mathbf{l}\cdot\mathbf{n}; r_{uv}))}{\pi (1 - E_{m,avg}(r_{uv}))}
\end{eqnarray}
We use this sum in all core BSDFs of our model. For now, however, we have omitted the Fresnel term, because at first we are only interested in a surface that is 100% reflective. $E_m$ and $E_{m,avg}$ denote the directional albedo and average albedo respectively. To keep it simple we replaced the anisotropic roughness $r_u, r_v$ with an isotropic approximation $r_{uv} = \sqrt{r_u r_v}$. This means that in the end our multiple-scattering term slightly underestimates the real contribution, but this is not a huge issue in typical scenes.
First we compute the directional albedo $E_m$.
\begin{eqnarray}
E_m(\mathbf{v}; r_{uv}) &=& \int_{\Omega_\mathbf{l}} M_r(\mathbf{v}, \mathbf{l}, \mathbf{h}_r; r_{uv}) (\mathbf{l} \cdot \mathbf{n}) \, \mathrm d \mathbf{l} \\
\implies E_m(\theta_v, \phi_v; r_{uv}) &=& \int_{0}^{2\pi} \int_{0}^{\frac{\pi}{2}} M_r(\theta_l, \phi_l, \theta_v, \phi_v; r_{uv}) \cos \theta_l \sin \theta_l \, \mathrm d \theta_l \, \mathrm d \phi_l
\end{eqnarray}
We are only interested in the difference between $\phi_l$ and $\phi_v$, because rotating the BRDF does not change the result. Therefore, with $\phi=\phi_l - \phi_v$ and $\phi_v = 0$ ($\implies \mathrm d \phi = \mathrm d \phi_l$) we get
\begin{eqnarray}
E_m(\theta_v; r_{uv}) &=& \int_{0}^{2\pi} \int_{0}^{\frac{\pi}{2}} M_r(\theta_l, \phi, \theta_o; r_{uv}) \cos \theta_l \sin \theta_l \, \mathrm d \theta_l \, \mathrm d \phi
\end{eqnarray}
By reparameterization with $\mu_{\{l,v\}} = \cos \theta_{\{l,v\}}$ ($\implies \mathrm d \mu_{\{l,v\}} = -\sin \theta_{\{l,v\}} \, \mathrm d \theta_{\{l,v\}}$), we arrive at the simpler form
\begin{eqnarray}
E_m(\mu_v; r_{uv}) = \int_{0}^{2\pi} \int_{0}^{1} M_r(\mu_l, \phi, \mu_v; r_{uv}) \, \mu_l \, \mathrm d \mu_l \, \mathrm d \phi \\
\end{eqnarray}
Evaluating this integral for different values of $\mu_v$ and isotropic roughness $r$ results in the image shown in Figure [energy-compensation-ggx-e].
![Figure [energy-compensation-ggx-e]: Directional albedo of single-scattering microfacet GGX BRDF.](img/energycomp_ggx_e.png)
Integrating over the hemisphere once more gives us the average albedo (Figure [energy-compensation-ggx-e-avg]):
\begin{eqnarray}
E_{m, avg}(r_{uv}) &=& 2 \int_0^1 E_{m}(\mu_v; r_{uv}) \mu_v \, \mathrm d \mu_v
\end{eqnarray}
![Figure [energy-compensation-ggx-e-avg]: Average albedo of single-scattering microfacet GGX BRDF.](img/energycomp_ggx_e_avg.png)
We are now able to store these results in a lookup table (e.g., with a size of 32x32 pixels) and fetch them during the evaluation of the BSDF to compute the energy compensation term $M_{r,ms}$.
So far, we ignored the Fresnel term. But similar to scaling the single-scattering microfacet term with a single-scattering Fresnel term, we need to scale the multiple-scattering compensation term with the average Fresnel. This is the average Schlick Fresnel:
\begin{eqnarray}
F_{m,avg}(f_0, f_{90}) &=& \frac{1}{21} f_{90} + \frac{20}{21} f_0
\end{eqnarray}
Instead of lookup tables, it is also possible to use a numerical fit for the data. As an alternative to the fit in
[#KC17], we found the following that has higher error, but less computational effort:
\begin{eqnarray}
\label{energycomp-ggx-fit}
E_m(\cos\theta; \alpha_{uv}) &=& 1 - 1.4594\alpha_{uv}\cos\theta \\
&&* \left(-0.20277 + \alpha_{uv} (2.772 + \alpha_{uv} (-2.6175 + 0.73343 \alpha_{uv}))\right) \nonumber\\
&&* \left(3.09507 + \cos\theta (-9.11369 + \cos\theta (15.8884 + \cos\theta (-13.70343 + 4.51786 \cos\theta)))\right)
\nonumber\\
\alpha_{uv} &=& \alpha_u \alpha_v = r_u^2 r_v^2\\
\nonumber\\
E_{m,avg}(\alpha_{uv}) &=& 1.0 + \alpha_{uv} (-0.113 + \alpha_{uv} (-1.8695 + \alpha_{uv} (2.2268 - 0.83397
\alpha_{uv})))
\end{eqnarray}
Note that we convert from anisotropic to isotropic roughness $\alpha_{uv}$ to simplify the function.
Results from the white furnace test are shown in Figure [energycomp_none-ggx], Figure [energycomp_fit-ggx] and Figure [energycomp_lut-ggx]. While there is still a bit of energy loss when using the fitted function, the sphere becomes almost invisible when using the more accurate data from the 32x32 table.
![Figure [energycomp_none-ggx]: White furnace test without energy compensation for $r=\{0.1, 0.6, 0.9\}$.](img/energycomp_none-ggx.png)
![Figure [energycomp_fit-ggx]: Energy compensation with numerical fit (Equation [energycomp-ggx-fit]).](img/energycomp_fit-ggx.png)
![Figure [energycomp_lut-ggx]: Energy compensation with lookup table.](img/energycomp_lut-ggx.png)
We provide the lookup tables for download in our Github repository:
* [res/GGX_E.exr](https://github.com/DassaultSystemes-Technology/EnterprisePBRShadingModel/tree/master/res/GGX_E.exr): $E_m(\cos\theta; r_{uv})$, $x$: $\cos\theta$, $y$: $r_{uv}$.
* [res/GGX_E_avg.exr](https://github.com/DassaultSystemes-Technology/EnterprisePBRShadingModel/tree/master/res/GGX_E_avg.exr): $E_{m,avg}(r_{uv})$, $x$: $\cos\theta$.
### Diffuse BRDF
The incident illumination that hits an object will either be reflected at the surface or enter it and be scattered equally in all directions. The latter results in a diffuse look that is modeled with the diffuse component $B$. The ratio between specular and diffuse reflection is determined by the Fresnel term.
For an energy-preserving and energy-conserving combination of the components we apply the same ideas as for the GGX energy compensation described in Section [Multiple-Scattering GGX BRDFs]. We measure how much energy is left after evaluating the Fresnel-weighted multiple-scattering GGX BRDF and scale the diffuse BRDF accordingly.
First we compute the directional albedo of the multiple-scattering GGX including the Fresnel term:
\begin{equation}
\begin{aligned}
E(\mu_v; r_{uv}, f_0) =& \int_{0}^{2\pi} \int_{0}^{1} M_r(\mu_l, \phi, \mu_v; r_{uv}) F(\mu_l; f_0, 1) \\
&\quad\quad\quad\quad+ M_{r,ms}(\mu_l, \phi, \mu_v) F_{ms}(f_0, 1) \, \mu_l \, \mathrm d \mu_l \, \mathrm d \phi
\end{aligned}
\end{equation}
This results in a 3D lookup table, see Figure [energy-compensation-base-e]. As the function is smooth, a resolution of 16 pixels in each dimension is sufficient.
![Figure [energy-compensation-base-e]: Directional albedo of Fresnel-weighted multi-scattering microfacet GGX BRDF for different values of $f_0$.](img/energycomp_base_e.png)
As before, we integrate over the hemisphere once more to get average albedo
\begin{eqnarray}
E_{avg}(r_{uv}, f_0) &=& 2 \int_0^1 E(\mu_v; r_{uv}, f_0) \mu_v \, \mathrm d \mu_v
\end{eqnarray}
and store the result of the integration in a table with 16x16 pixels (Figure [energy-compensation-base-e-avg]).
![Figure [energy-compensation-base-e-avg]: Average albedo of Fresnel-weighted multi-scattering microfacet GGX BRDF for different values of $f_0$.](img/energycomp_base_e_avg.png)
It is possible to use the following approximations instead of the look up tables:
\begin{eqnarray}
\label{energycomp-base-fit}
E(\cos\theta; r_{uv}, f_0) &=& (1 - \alpha_{uv})^5 (f_0 + (1.0 - f_0)(1 - \cos\theta)^5) \,+ \\
&& (1 - (1 - \alpha_{uv})^5) (0.04762 + 0.95238 f_0) \\
E_{avg}(r_{uv}, f_0) &=& E_0 + (-0.33263 \alpha_{uv} - 0.072359) (1 - E_0) E_0
\end{eqnarray}
with $\alpha_{uv} = r_{uv}^2$.
Figure [energycomp_fit-base] and Figure [energycomp_lut-base] compare the numerical fit provided in Equation [energycomp-base-fit] to the tabulated data. For typical values of $f_0$ in range $[0,0.08]$, which corresponds to an index of refraction in range $[1.0,2.0]$, the energy loss is acceptable. The tabulated data is more precise in all cases.
![Figure [energycomp_fit-base]: White furnace test for combination of diffuse and specular component with numerical fit (Equation [energycomp-ggx-fit]) ($r=0.5$ and $f_0 = \{0.04, 0.5, 0.9\}$).](img/energycomp_fit-base.png)
![Figure [energycomp_lut-base]: Combination of diffuse and specular component with tabulated data.](img/energycomp_lut-base.png)
We provide the lookup tables for download in our Github repository:
* [res/Base_*_E.exr](https://github.com/DassaultSystemes-Technology/EnterprisePBRShadingModel/tree/master/res/): $E(\cos\theta; r_{uv}, f_0)$, $x$: $\cos\theta$, $y$: $r_{uv}$, filename: $f_0$
* [res/Base_E_avg.exr](https://github.com/DassaultSystemes-Technology/EnterprisePBRShadingModel/tree/master/res/Base_E_avg.exr): $E_{avg}(r_{uv}, f_0)$, $x$: $r_{uv}$, $y$: $f_0$
### Sheen BRDF
We use the albedo-scaling technique described in [#KS01] and [#CK17] to layer the sheen BRDF on top of the core material. As the technique supports arbitrary BSDFs as base layer, it does not depend on the parameters of the core material.
As before, we precompute the directional albedo of the sheen BRDF (Equation [sheen-brdf-directional-albedo]). This results in a 16x16 2D lookup table (Figure [energy-compensation-sheen-e]).
\begin{equation}
\label{sheen-brdf-directional-albedo}
E_b(\mu_v; r_b) = \int_{0}^{2\pi} \int_{0}^{1} M_b(\mu_l, \phi, \mu_v; r_b) \, \mu_l \, \mathrm d \mu_l \, \mathrm d \phi
\end{equation}
![Figure [energy-compensation-sheen-e]: Directional albedo of the sheen BRDF.](img/energycomp_sheen_e.png)
We provide the lookup table for download in our Github repository:
* [res/Sheen_E.exr](https://github.com/DassaultSystemes-Technology/EnterprisePBRShadingModel/tree/master/res/Sheen_E.exr): $E_b(\cos\theta; r_b)$, $x$: $\cos\theta$, $y$: $r_b$
### Alternative Sheen BRDF
We precompute the directional albedo of the alternative sheen BRDF using Equation [sheen-brdf-directional-albedo] (Figure [energy-compensation-sheen-ash-e]).
![Figure [energy-compensation-sheen-ash-e]: Directional albedo of the alternative sheen BRDF.](img/energycomp_sheen_ash_e.png)
![Figure [white-furnace-sheen-ash-e]: White furnace test of alternative sheen BRDF with roughness from 0 to 1, left to right. Red pixels indicate energy gain.](img/furnace_ashikhmin.png)
The lookup table is also provided for download in our Github repository:
* [res/Sheen_ash_E.exr](https://github.com/DassaultSystemes-Technology/EnterprisePBRShadingModel/tree/master/res/Sheen_ash_E.exr): $E_b^\text{ash}(\cos\theta; r_b)$, $x$: $\cos\theta$, $y$: $r_b$
## Flake Consistency
You might have noticed that we do not define the hashing function or the PRNG used for generating flakes. On the one hand this limits consistency of flakes between different renderers because different random number generators will produce different flake position and orientation values for grid cells. On the other hand this gives you an opportunity to try out different hashing functions and PRNGs depending on your needs. From our experience, using different hashing functions and PRNGs can significantly affect shading performance.
Another thing you can experiment with is the the number of flakes per grid cell. For cheaper hashing functions it's beneficial to have low number of flakes per grid cell like 1 or 2.
Bibliography
============
[#Bur12]: Brent Burley. Physically-Based Shading at Disney, SIGGRAPH 2012.
[#Bur15]: Brent Burley. Extending the Disney BRDF to a BSDF with Integrated Subsurface Scattering., SIGGRAPH 2015.
[#CK17]: Alejandro Conty Estevez, Christopher Kulla. Production Friendly Microfacet Sheen BRDF, SIGGRAPH 2017.
[#Fde19]: Carmelo J. Fdez-Agüera. A Multiple-Scattering Microfacet Model for Real-Time Image-based Lighting., Journal of Computer Graphics Techniques Vol. 8, No. 1, 2019.
[#Hei14]: Eric Heitz. Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs., Journal of Computer Graphics Techniques Vol. 3, No. 2, 2014.
[#HG41]: Louis G. Henyey and Jesse L. Greenstein. Diffuse radiation in the galaxy. Astrophysical Journal 93, 70–83, 1941.
[#Hil18]: Stephen Hill. A Multi-Faceted Exploration, 2018. https://blog.selfshadow.com/2018/05/13/multi-faceted-part-1/
[#Kar13]: Brian Karis. Real Shading in Unreal Engine 4., SIGGRAPH 2013.
[#KC17]: Christopher Kulla, Alejandro Conty. Revisiting Physically Based Shading at Imageworks. 2017.
[#Jak14]: Wenzel Jakob et al. Discrete Stochastic Microfacet Models, ACM Transactions on Graphics (ACM SIGGRAPH 2014).
[#AK16]: Asen Atanasov and Vladimir Koylazov. A Practical Stochastic Algorithm for Rendering Mirror-Like Flakes. 2016.
[#KS01]: Csaba Keleman, Lazlo Szirmay-Kalos. A Microfacet Based Coupled Specular-Matte BRDF Model with Importance Sampling, Eurographics 2001.
[#Lag13]: Sébastien Lagarde. Memo on Fresnel equations, 2013. https://seblagarde.wordpress.com/2013/04/29/memo-on-fresnel-equations/
[#WMLT07]: Bruce Walter, Stephen R. Marschner, Hongsong Li, Kenneth E. Torrance. Microfacet models for refraction through rough surfaces., EGSR 2007.
[#NP13]: David Neubelt and Matt Pettineo. Crafting a Next-Gen Material Pipeline for The Order: 1886. 2013.
[#Cook82]: Robert L. Cook, Kenneth E. Torrance. 1982. A Reflectance Model for Computer Graphics.
License
=======
The Enterprise PBR Shading Model (DSPBR), © Dassault Systèmes 2021, is licensed under [CC-BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/). In addition, please acknowledge your use of the Dassault Systèmes Enterprise PBR Shading Model (DSPBR) when DSPBR is used or implemented in a product by adding the following "[name of the product] is implementing DSPBR, the Dassault Systèmes Enterprise PBR Shading Model", in a place and format which shall be reasonably visible.
![](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)
[license.png]: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAAPCAMAAABEF7i9AAAAllBMVEUAAAD///+rsapERER3d3eIiIjMzMzu7u4iIiKUmZO6v7rKzsoODg4RERFVVVUNDQ0NDg0PEA8zMzNLTEtbXltmZmZydnF9gn2AgICPkI+ZmZmqqqq7u7vFxsXIzMgNDQwZGRkgICAhISEkJSMnKCcuMC4xMzE5Ozk7PTtBQkFCQkJDQ0Nna2eGhoaHh4ezuLLGysbd3d1wVGpAAAAA0klEQVR42q2T1xbCIAyGk0CXdlmto3XvPd7/5QRL1432WHI4XED4+PMHALQHag0JJBlXMNQScx2ibu9PdTnQcY3iErYl6oxbAo/rUrUJA6J5vx0wNNC0gVkMbBPZXtQ8Uf6qpNJwOf0EjmCKto+ce1aSIg9FzTO1/xlYyVeL34FDMC3ZFT+SNXOX6PEsBKm0rIOYPYuGClnsWTxBHtQV1gRhI4UUGJh6EAsPoxdedjUPK+dzT38DDyvNXXYW9wJ43mh4h6ItN8U7Ldv+FN1/WXO8Aed5CQIgC4KiAAAAAElFTkSuQmCC
0.284,

0.284) | Metallic | 0 | Roughness | 0.3 | Anisotropy | 0 | Anisotropy Rotation | *0* | Normal | (0,0,1) | Transparency | *0* | Cut-Out Opacity | 1 | Specular | *1* | Specular Tint | *(1,1,1)* | Sheen | *0* | Sheen Color | *(1,1,1)* | Sheen Roughness | *0.3* | Clearcoat | *0* | Clearcoat Roughness | *0* | Clearcoat Normal | *(0,0,1)* | Emission Color | *(1,1,1)* | Emission Value | *0 lx* | Energy Norm. | *false* | Thin Walled | *true* | Index of Refraction | *1.5* | [Table [subtypes-parameters-basic]: Parameters of the Basic subtype.]