diff --git a/index.html b/index.html index 4d0e970..a6dbb7e 100644 --- a/index.html +++ b/index.html @@ -1108,12 +1108,20 @@ If the coat is rough, the microfacet BSDF lobes of the underlying base substrate (metal and dielectric) are also effectively roughened. If this is not otherwise accounted for by the light transport, it can instead be reasonably approximated by directly altering the NDF of the base BSDFs. -A formula we recommend for this is obtained by identifying the NDF of each microfacet lobe as corresponding approximately to a Gaussian in slope-space with variance given by $\alpha_t^2 + \alpha_b^2 = r^4$ (in the notation of the [Microfacet model](index.html#model/microfacetmodel) section). Modeling the effect of the roughening as the convolution of these Gaussian NDFs (and double counting the coat variance since the reflection passes through the coat boundary twice), the resulting modified roughness of the base, $r'_\mathrm{B}$, (taking into account the presence weight of the coat, $\mathtt{C}=$ **`coat_weight`**) is given by +We work in GGX $\alpha$-space, where $\alpha = r^2$. Let $\alpha_\mathrm{B} = r_\mathrm{B}^2$ and $\alpha_\mathrm{C} = r_\mathrm{C}^2$ denote the GGX alphas of the base and coat respectively, and let $\eta_\mathrm{ca} = n_c/n_a$ be the IOR of the coat relative to the ambient medium (i.e. **`coat_ior`**). A base lobe with GGX alpha $\alpha_\mathrm{B}$ inside the coat appears broadened to $\eta_\mathrm{ca}\,\alpha_\mathrm{B}$ when viewed from outside, due to Snell's law angular expansion at the exit interface. The coat contributes additional broadening via refraction through its tilted microfacets, with both entry and exit refractions adding variance independently. This motivates an IOR-dependent coat broadening coefficient: \begin{equation} -r'_\mathrm{B} = \mathrm{lerp}\Bigl( r_\mathrm{B}, \mathrm{min} \bigl(1, r^4_\mathrm{B} + 2 r^4_\mathrm{C} \bigr)^\frac{1}{4}, \mathtt{C} \Bigr) +B(\eta_\mathrm{ca}) = 1.05\;\frac{(\eta_\mathrm{ca}-1)\sqrt{1+\eta_\mathrm{ca}^2}}{\eta_\mathrm{ca}} \end{equation} -where $r_\mathrm{B}=$ **`specular_roughness`** and $r_\mathrm{C}=$ **`coat_roughness`**. - +where the prefactor $1.05$ is fit to Monte Carlo simulations. Adding the base and coat contributions in quadrature gives the raw broadened alpha: +\begin{equation} \label{coat_roughening_heuristic} +\alpha_\mathrm{raw} = \sqrt{\bigl(\eta_\mathrm{ca}\,\alpha_\mathrm{B}\bigr)^2 + \bigl(B(\eta_\mathrm{ca})\,\alpha_\mathrm{C}\bigr)^2} +\end{equation} +At high roughness, total internal reflection at the coat exit prevents steeply angled rays from escaping, imposing an upper limit on the observable lobe width. This is modeled with a smooth $\tanh$ saturation: +\begin{equation} +\alpha_\mathrm{eff} = \alpha_\mathrm{max}\,\tanh\!\left(\frac{\alpha_\mathrm{raw}}{\alpha_\mathrm{max}}\right), \qquad \alpha_\mathrm{max} = 0.85 +\end{equation} +The effective roughness is then $r'_\mathrm{B} = \sqrt{\alpha_\mathrm{eff}}$, where $r_\mathrm{B}=$ **`specular_roughness`** and $r_\mathrm{C}=$ **`coat_roughness`**. +The presence weight of the coat ($\mathtt{C}=$ **`coat_weight`**) is accounted for by blending: $\mathrm{lerp}(r_\mathrm{B},\, r'_\mathrm{B},\, \mathtt{C})$. ### Total internal reflection @@ -1180,9 +1188,9 @@ The form of this model is the following (with $\mu_i, \mu_o$ the angle cosines to the normal of $\omega_i, \omega_o$): \begin{equation} -\mu_i \, f_\mathrm{fuzz}(\omega_i, \omega_o) = \mathbf{F} \, E_\mathrm{fuzz}(\mu_o, \alpha) \, D(\mu_i | \mu_o, \alpha) +\mu_i \, f_\mathrm{fuzz}(\omega_i, \omega_o) = \mathbf{F} \, E_\mathrm{fuzz}(\mu_o, r_F) \, D(\mu_i | \mu_o, r_F) \end{equation} -where $\mathbf{F}$ = **`fuzz_color`**, $E_\mathrm{fuzz}(\mu_o, \alpha)$ (termed $R$ in [#Zeltner2022]) is the reflectance at angle cosine $\mu_o$ given roughness $\alpha$ = **`fuzz_roughness`** $\in [0,1]$, and $D(\mu_i | \mu_o, \alpha)$ is a lobe defined by linear transformations of a cosine lobe (LTCs), where the transformation matrices (and $E_\mathrm{fuzz}$) are tabulated in a grid in the $(\mu_o, \alpha)$ plane, with values fitted to a simulation of the scattering in the volumetric fuzz microflake layer. Since the LTC lobe $D$ is a normalized PDF over the hemisphere, the resulting albedo of $f_\mathrm{fuzz}$ is $\mathbf{F} \, E_\mathrm{fuzz}(\mu_o, \alpha)$. +where $\mathbf{F}$ = **`fuzz_color`**, $E_\mathrm{fuzz}(\mu_o, r_F)$ (termed $R$ in [#Zeltner2022]) is the reflectance at angle cosine $\mu_o$ given roughness $r_F$ = **`fuzz_roughness`** $\in [0,1]$ (termed $\alpha$ in [#Zeltner2022]), and $D(\mu_i | \mu_o, r_F)$ is a lobe defined by linear transformations of a cosine lobe (LTCs), where the transformation matrices (and $E_\mathrm{fuzz}$) are tabulated in a grid in the $(\mu_o, r_F)$ plane, with values fitted to a simulation of the scattering in the volumetric fuzz microflake layer. Since the LTC lobe $D$ is a normalized PDF over the hemisphere, the resulting albedo of $f_\mathrm{fuzz}$ is $\mathbf{F} \, E_\mathrm{fuzz}(\mu_o, r_F)$. If using the albedo-scaling interpretation of layering, a reasonable approximation of the reflection from the fuzz layer combined with the reflection from the base is to take \begin{eqnarray} @@ -1196,6 +1204,8 @@ The fuzz shading normal is assumed to inherit from that of the substrate layer, the physical picture being that the fuzz volume settles and conforms to the geometry of the substrate. The substrate is generally a mixture of coat and uncoated base. Thus physically the fuzz model should be evaluated with each of the **`geometry_coat_normal`** and **`geometry_normal`** separately (if they differ), and the final result blended according to the **`coat_weight`**. As a practical approximation, it may be more convenient and efficient to instead approximate the fuzz normal by interpolating the coat and base normal according to **`coat_weight`**. +Unlike the coat, the fuzz layer is index-matched with the ambient medium (IOR $n_a$), so refraction does not alter the direction of unscattered rays passing through it. Consequently, *we recommend that the base lobe should not be roughened by the fuzz layer.* The base lobe retains its original angular distribution, attenuated only by the extinction through the fuzz volume. Any apparent broadening of the overall reflected lobe arises from the scattered fuzz contribution sitting alongside the unmodified base lobe, not from widening the base lobe itself. + Fuzz params | Label | Type | Range | Default | Description ---------------------|-----------|----------|:------------:|:-------------:|---------------------------------------------- diff --git a/reference/open_pbr_surface.mtlx b/reference/open_pbr_surface.mtlx index a135644..9fd0f69 100644 --- a/reference/open_pbr_surface.mtlx +++ b/reference/open_pbr_surface.mtlx @@ -266,31 +266,100 @@ - - + + + - - - - - + - + - - - - - - - + + + + + + + + + + + + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +