Roughening improvements#261
Roughening improvements#261portsmouth wants to merge 5 commits intoAcademySoftwareFoundation:dev_1.2from
Conversation
| The effect of the coat roughening can then be modeled as the convolution of these Gaussian NDFs, which corresponds to adding the variances (double counting the coat variance since the reflection passes through the coat boundary twice). The IOR ratio of the coat and ambient medium $\eta_\mathrm{ca}$ also needs to be accounted for, since as $\eta_\mathrm{ca} \rightarrow 1$ the roughening due to the coat goes to zero. | ||
| This leads to the following suggested approximate formula for the modified roughness $r'_\mathrm{B}$ of the base due to the coat: | ||
| \begin{equation} \label{coat_roughening_heuristic} | ||
| r'_\mathrm{B} = \mathrm{min} \bigl(1, r^4_\mathrm{B} + 2 x_C r^4_\mathrm{C} \bigr)^\frac{1}{4} \quad \textrm{with } x_C = 1 - \mathrm{min}(\eta_\mathrm{ca}, 1/\eta_\mathrm{ca}) |
There was a problem hiding this comment.
Does "x" mean something or is it just an arbitrary available variable name?
There was a problem hiding this comment.
Just a variable name. It accounts for the IOR, so not sure what symbol to use. Putting the min inside the brackets looked worse.
|
Regarding the effect of dark fuzz in the images, I think the
True. The Zeltner model is based on non-absorbing microflakes and it doesn't make a distinction between scattered and unscattered transmission. So some of the transmitted light is actually scattered light that should be eliminated if the single-scattering albedo of the microflakes is zero. So I agree that the dark fuzz should technically darken the base surface more. That said, in your renders it's hard to see how much the dark fuzz is actually darkening the base because the specular highlight is overexposed and the background is black. |
| \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)$. |
There was a problem hiding this comment.
I assume you're using different variables than the Zeltner paper to be consistent with other formulas in the OpenPBR spec. Is that right?
There was a problem hiding this comment.
Yes, since
| The scattering within the fuzz layer will have the effect of roughening the appearance of the substrate beneath it. | ||
| A simple suggested approximation for this can be adapted from the formula used to model the coat roughening, in equation [coat_roughening_heuristic]. If we consider the fuzz layer to generate roughening by scattering, we can approximate its effective roughness as being proportional to the albedo of the layer, as well as to the tint color (since darker fuzz will physically scatter less and absorb more). This leads to the following heuristic for the modified roughness $r'_\mathrm{B}$ of the substrate lobe: | ||
| \begin{equation} \label{fuzz_roughening_heuristic} | ||
| r'_\mathrm{B} = \mathrm{min} \bigl(1, r^4_\mathrm{B} + 2 R^4_\mathrm{F} \bigr)^\frac{1}{4} \quad \textrm{with $R_F = \mathrm{lum}(\mathbf{F} E_\mathrm{fuzz})$} |
There was a problem hiding this comment.
The inclusion of E_fuzz here means that the roughening will be more intense at grazing angles where the optical density is higher, correct?
There was a problem hiding this comment.
The fuzz doesn't use a GGX distribution like the coat, so I wonder whether these fourth powers are still justifiable.
Based on my own empirical testing, I had to tone down the fuzz roughening quite a bit (compared to coat roughening) to get it to look plausible.
There was a problem hiding this comment.
Also, the E_fuzz functions almost like a coverage weight, since it's essentially the opacity of the fuzz layer, so intuitively it seems like the blending based on E_fuzz (and maybe the color F too) should be a simple lerp on the final roughness (unaffected by the powers and roots).
There was a problem hiding this comment.
The inclusion of E_fuzz here means that the roughening will be more intense at grazing angles where the optical density is higher, correct?
Yes true.
The fuzz doesn't use a GGX distribution like the coat, so I wonder whether these fourth powers are still justifiable.
The
So I am just loosely assuming that this albedo can be a sort of proxy of the "amount of scattering", and thus the amount of roughening captured in a roughness scalar
If the roughening is some (angular) Gaussian blurring with the angular blur varying with
We'll need to do some simulations to check how it compares to reality, and fix it up accordingly.
E_fuzz functions almost like a coverage weight, since it's essentially the opacity of the fuzz layer
Not sure I agree, since as noted it's really the albedo (varying with input direction). The coverage (and opacity) is constant in the Zeltner model, i.e. unit optical depth of fuzz.
Obviously we also have the fuzz weight, functioning as an actual coverage weight, which should affect the roughening.
|
Great to have the IOR officially included in the spec's coat roughening formula and a mention of fuzz roughening. Conceptually, the form of the fuzz roughening is questionable compared to coat roughening. The coat has a refractive interface, so all light passing through it is scattered. But the fuzz is effectively a volume without an interface, so only some of the transmitted light is scattered. The fuzz should ideally produce a mixture of roughened and un-roughened base lobes. Plus the scattering distribution should ideally be different due to the anisotropic scattering of the fuzz. So, I wonder if a stochastic selection of roughened and un-roughened base roughness (based on a rough estimate of the scattered/unscattered transmission of the fuzz) would produce better results. (The proposed specular haze could potentially be leveraged to roughen only a fraction of the light, but the haze might already be in use.) |
|
Totally agree that we need to do more work on both of these formulas to produce the best approximation we can offer. For this we are going to need a combination of theory and simulation. I’m hoping we can work on this in the coming weeks as part of the preparation for the siggraph presentation. Even if it doesn’t make it into the presentation, we probably have enough time (say till the end of the year) to come up with a more physically based model for the 1.2 release. |
|
I am removing the roughening from the 1.2 scope as discussed in the meeting. We currently don't have a consensus for a good approximation of the roughening effect and having a built in approximation that is not satisfactory and can't be dialed down could be detrimental. We could acknowledge in the spec that roughening should happen but that the literature does not provide a suitable approximation at the moment. |
|
The write-up should probably be clearer about how this works when anisotropy is present (i.e. it just remaps the roughness, and doesn't alter the base anisotropy. Which hopefully is a reasonable approximation if the coat is anisotropic, though probably not if the coat itself is anisotropic). |


According to the discussion in #239 (and on Slack), we need to provide a less obviously wrong suggestion for the coat roughening effect.
Based on Monte Carlo sims, the latest recommendation is as follows:
For the fuzz, the sims shows that no roughening is appropriate, if using the Zeltner model.
The MaterialX implementation has been updated accordingly.