Name | Car Paint | Metal
--------------------|:----------------------------------------------------:|:-----------------:
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 Size | 0.05 | *0*
Flake Roughness | 0.25 | *0*
Flake Color | (0.49,0.180,0.3537) | *(1,1,1)*
Clearcoat | 1 | *0*
Clearcoat Roughness | 0 | *0*
Clearcoat Normal | (0,0,1) | *(0,0,1)*
| ![](img/subtypes_carpaint.png width="160px") | ![](img/subtypes_metal.png width="160px")
[Table [subtypes-parameters-metals]: List of fixed (italic light grey) and user-defined values with their defaults for the parameters of the different recommended metallic material subtypes. Emissive, sheen, clear-coat and volumetric parameters are omitted because the effects are not available and parameters can be kept at their defaults (Section [components]).]

Name | Basic | Emissive | Textile | Wood |
--------------------|:-------------------------------------------------:|:------------------------------------------------:|:-------------------------------------------------:|:------------------------------------------:|
Albedo | (0.284,

0.284,

0.284) | *(0,0,0)* | (0.302,

0.294,

0.236) | (0.344,

0.227,

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

0.82,

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

0.442,

0.298) | *(1,1,1)* | *(1,1,1)* | Emission Value | *0 lx* | 10 lx | *0 lx* | *0 lx* | Energy Norm. | *false* | false | *false* | *false* | Thin Walled | *true* | *true* | *true* | *true* | Index of Refraction | *1.5* | *1.5* | *1.5* | *1.5* | | ![](img/subtypes_basic.png width="100px") | ![](img/subtypes_emissive.png width="100px") | ![](img/subtypes_textileleather.png width="100px")| ![](img/subtypes_wood.png width="100px") | [Table [subtypes-parameters-opaque-dielectrics]: List of fixed (italic light grey) and user-defined values with their defaults for the parameters of the different recommended non-volumetric dielectric material subtypes. Volumetric parameters are omitted because the effects are not available and parameters can be kept at their defaults (Section [components]).]

0.284,

0.284) | *(0,0,0)* | (0.302,

0.294,

0.236) | (0.344,

0.227,

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

0.82,

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

0.442,

0.298) | *(1,1,1)* | *(1,1,1)* | Emission Value | *0 lx* | 10 lx | *0 lx* | *0 lx* | Energy Norm. | *false* | false | *false* | *false* | Thin Walled | *true* | *true* | *true* | *true* | Index of Refraction | *1.5* | *1.5* | *1.5* | *1.5* | | ![](img/subtypes_basic.png width="100px") | ![](img/subtypes_emissive.png width="100px") | ![](img/subtypes_textileleather.png width="100px")| ![](img/subtypes_wood.png width="100px") | [Table [subtypes-parameters-opaque-dielectrics]: List of fixed (italic light grey) and user-defined values with their defaults for the parameters of the different recommended non-volumetric dielectric material subtypes. Volumetric parameters are omitted because the effects are not available and parameters can be kept at their defaults (Section [components]).]

Name | Glass | Plastic |
--------------------|:-----------------------------------------------:|:---------------------------------------------------:|
Albedo | (1,1,1) | (0.004,

0.004,

0.004) | Roughness | 0 | 0.25 | Metallic | *0* | *0* | 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) | | ![](img/subtypes_glass.png width="160px") | ![](img/subtypes_plastic.png width="160px") | [Table [subtypes-parameters-transparent-dielectrics]: List of fixed (italic light grey) and user-defined values with their defaults for the parameters of the different recommended transparent dielectric material subtypes. Emissive, sheen and clear-coat parameters are omitted because the effects are not available and parameters can be kept at their defaults (Section [components]).]

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 varietey of materials from just a very small subset of the whole parameter set, namely albedo, metallic, roughness and normal map. Another aspect of this is the fact that it allows users to parameterize materials in a way that they are *physically-based as a default*, but can be tweaked when needed for more artistic freedom, for example via the specular tint and specular parameters. Wherever possible, the 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 *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
-------------
* Displacement mapping.
* Translucency.
* New sheen effect based on "Charlie" Sheen BRDF, layered on top of core material via albedo-scaling [#CK17].
* Alternative visibility term for "Charlie" Sheen BRDF [#NP13].
* Emission is now below clearcoat in the layering stack.
* Henyey-Greenstein phase function for volume scattering [#HG41].
* 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 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, b) &=&\\
&&m & \text{Metallic}(\rho) \nonumber\\
&+&(1-m)(1-t) & \text{OpaqueDielectric}(\rho, s, \eta, \rho_s, b) \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, b) &=& \text{ThinCore}(\mathbf{v}, \mathbf{l}; r_u, r_v, \rho, s, \eta, \rho_s, b) \\
\text{Metallic}(\rho) &=& \text{Metallic}(\mathbf{v}, \mathbf{l}; r_u, r_v, \rho) \\
\text{OpaqueDielectric}(\rho, s, \eta, \rho_s, b) &=& \text{OpaqueDielectric}(\mathbf{v}, \mathbf{l}; r_u, r_v, \rho, s, \eta, \rho_s, b) \\
\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, b) &=& \\
&&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, b) \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_t}^\prime \, (1 - s \, F(\cos\theta_t; 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_t}^\prime \, (1 - s \, F(\cos\theta_t; F_0 \rho_s, 1)) \nonumber\\
&&+& (1-m)(1-t) \rho \, B(\mathbf{v}, \mathbf{l}; s, F_0, \rho_s, b)
\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, b)&=&& 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_t}^\prime \, (1 - s \, F(\cos\theta_t; F_0 \rho_s, 1)) \nonumber\\
&&+& (1-m)(1-t) \rho \, B(\mathbf{v}, \mathbf{l}; s, F_0, \rho_s, b)
\end{eqnarray}
Energy Compensation
-------------------
### Multiple-Scattering GGX BRDFs
The missing energy due to the missing multiple-scattering in the GGX microfacet model $M_r(\mathbf{v},\mathbf{l})$ is approximated by adding an additional compensation term $M_{r,ms}(\mathbf{v},\mathbf{l})$ [#KC17].
\begin{eqnarray}
f_{r,1}(\mathbf{v},\mathbf{l}) &=& M_r(\mathbf{v},\mathbf{l}) + M_{r,ms}(\mathbf{v},\mathbf{l}) \\
&=& M_r(\mathbf{v},\mathbf{l}) + \frac{(1 - E_m(\mathbf{v}\cdot\mathbf{n})(1 - E_m(\mathbf{l}\cdot\mathbf{n}))}{\pi (1 - E_{m,avg})}
\end{eqnarray}
We first omit the Fresnel term for simplicity, assuming that the material is 100% reflective. $E_m$ and $E_{m,avg}$ denote the directional albedo and average albedo respectively, and will be computed in the following.
First we compute the directional albedo $E_m(\mathbf{v})$.
\begin{eqnarray}
E_m(\mathbf{v}) &=& \int_{\Omega_\mathbf{l}} M_r(\mathbf{v}, \mathbf{l}) (\mathbf{l} \cdot \mathbf{n}) \, \mathrm d \mathbf{l} \\
\implies E_m(\theta_v, \phi_v) &=& \int_{0}^{2\pi} \int_{0}^{\frac{\pi}{2}} M_r(\theta_l, \phi_l, \theta_v, \phi_v) \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) &=& \int_{0}^{2\pi} \int_{0}^{\frac{\pi}{2}} M_r(\theta_l, \phi, \theta_o) \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) = \int_{0}^{2\pi} \int_{0}^{1} M_r(\mu_l, \phi, \mu_v) \, \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} &=& 2 \int_0^1 E_{m}(\mu_v) \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}(\mathbf{v},\mathbf{l})$.
Including the Fresnel term [#Hil18], the complete multiple-scattering GGX BRDF looks as follows:
\begin{eqnarray}
f_{r}(\mathbf{v},\mathbf{l}) &=& M_r(\mathbf{v},\mathbf{l}) \, F(\mathbf{h_r}) + M_{r,ms}(\mathbf{v},\mathbf{l}) \, F_{ms} \\
&=& M_r(\mathbf{v},\mathbf{l}) \, F(\mathbf{h}_r \cdot \mathbf{v}) + \frac{(1 - E_m(\mathbf{v}\cdot\mathbf{n})(1 - E_m(\mathbf{l}\cdot\mathbf{n}))}{\pi (1 - E_{m,avg})} \frac{{F_{m,avg}}^2 E_{m,avg}}{1 - F_{m,avg} (1 - E_{m,avg})}
\end{eqnarray}
with the average of the Schlick Fresnel:
\begin{eqnarray}
F_{m,avg} &=& \frac{1}{21} \rho_{s,r,90} + \frac{20}{21} \rho_{s,r,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)
* [res/GGX_E_avg.exr](https://github.com/DassaultSystemes-Technology/EnterprisePBRShadingModel/tree/master/res/GGX_E_avg.exr)
### 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(\mathbf{v}, \mathbf{l})$. 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 for different values of $\rho_{s,r,0}$ ($\rho_{s,r,90} = 1$).
\begin{eqnarray}
E(\mu_v) = \int_{0}^{2\pi} \int_{0}^{1} f_r(\mu_l, \phi, \mu_v) \, \mu_l \, \mathrm d \mu_l \, \mathrm d \phi
\end{eqnarray}
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 $\rho_{s,r,0}$.](img/energycomp_base_e.png)
As before, we integrate over the hemisphere once more to get average albedo
\begin{eqnarray}
E_{avg} &=& 2 \int_0^1 E(\mu_v) \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 $\rho_{s,r,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) &=& (1 - \alpha_{uv})^5 (E_0 + (1.0 - E_0)(1 - \cos\theta)^5) \,+ \\
&& (1 - (1 - \alpha_{uv})^5) (0.04762 + 0.95238 E_0) \\
E_{avg} &=& E_0 + (-0.33263 \alpha_{uv} - 0.072359) (1 - E_0) E_0
\end{eqnarray}
with $E_0 = F_0 \rho_{s,\text{max}}$, where $\rho_{s,\text{max}}$ denotes the maximum value of the wavelength-dependent
color $\rho_s$ in linear sRGB,E color space. The maximum is used because the color is subtracted, leading to unexpected
behavior if this is done per channel. Section [Parameters] describes these parameters in more detail.
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 $\rho_{s,r,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 $\rho_{s,r,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/)
* [res/Base_E_avg.exr](https://github.com/DassaultSystemes-Technology/EnterprisePBRShadingModel/tree/master/res/Base_E_avg.exr)
### 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) = \int_{0}^{2\pi} \int_{0}^{1} M_b(\mu_l, \phi, \mu_v) \, \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)
Using the directional albedo, it is possible to combine the sheen BRDF $f_b$ with an arbitrary BRDF $f$ as follows:
\begin{equation}
f_b(\mathbf{v}, \mathbf{l}) + f(\mathbf{v}, \mathbf{l}) \min(1 - E(\mathbf{v}\cdot\mathbf{n}), 1 - E(\mathbf{l}\cdot\mathbf{n}))
\end{equation}
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)
### 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)
## Flake Consistency
You might have noticed that we do not define hashing function and PRNG used for generating flakes. This limits consistency of flakes between different renderers because different random number generators will produce different flake position, orientation values for grid cells, but gives you opportunity to try out different ones depending on your needs. From our experience, this can significantly affect shading performance. Additionally number of flakes per grid cell is also something you can experiment with. 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 2019, 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.004,

0.004) | Roughness | 0 | 0.25 | Metallic | *0* | *0* | 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) | | ![](img/subtypes_glass.png width="160px") | ![](img/subtypes_plastic.png width="160px") | [Table [subtypes-parameters-transparent-dielectrics]: List of fixed (italic light grey) and user-defined values with their defaults for the parameters of the different recommended transparent dielectric material subtypes. Emissive, sheen and clear-coat parameters are omitted because the effects are not available and parameters can be kept at their defaults (Section [components]).]