Computer Graphics · Shading Models
Compensating for Multiple Scattering in Rough Specular Models
Why a single-scattering microfacet lobe loses energy as roughness rises, and how a tabulated directional albedo plus a complement lobe restores the budget without breaking reciprocity.
A rough metal rendered with an exact single-scattering microfacet model looks wrong in a way that is easy to measure and hard to name. The highlights are plausible, the Fresnel tint is right, and the surface still reads as darker and less saturated than the same metal photographed. The missing light is not a tuning problem. It is energy that the model structurally cannot represent.
The cause is the word single. A microfacet BRDF as normally written accounts for paths that strike exactly one facet and leave. On a rough surface, a meaningful share of light strikes a facet, reflects onto another part of the same microsurface, and leaves later. That second reflection is attenuated by the Fresnel factor again, which is why the deficit shows up as a loss concentrated in the non-grazing region rather than at the rim.
The size of the deficit
The deficit is the difference between one and the directional albedo of the single-scattering lobe:
$$E_{ss}(\omega_i) = \int_{\Omega} f_{ss}(\omega_i, \omega_o), (\omega_o \cdot n), d\omega_o$$
For a perfect mirror with Fresnel reflectance one, E_ss is exactly one for all roughness: every facet reflects everything and masking is the only loss, and the Smith visibility term is constructed to be consistent with the distribution, so the integral stays at one. The moment Fresnel is below one, multiple bounces matter: each bounce multiplies reflectance by F, so a second bounce contributes F², a third F³, and the single-scattering model keeps only the F¹ term.
For a dielectric with F₀ around 0.04, the second bounce contributes about 0.0016 of the incident energy and the deficit is small enough to ignore. For a conductor with F₀ near 1, the series is long and the deficit is large. Somewhere in between, the visible effect is a rough metal that looks chalky rather than bright.
The deficit grows with roughness because rougher surfaces produce more facet-to-facet events, and it grows with grazing angle because the geometry concentrates interactions near the silhouette. Integrating the single-scattering lobe analytically shows the deficit growing into a substantial fraction of the reflected energy as roughness rises with a conductor-like Fresnel value, which is why the correction appears in physically based shading implementations rather than only in papers.
Why the naive fix fails
The obvious fix is to scale the whole lobe up by a constant so that the normal-incidence integral reaches one. That fails for three reasons.
First, a constant scale cannot be correct at all angles. The deficit is a function of incident direction, and it rises steeply near grazing. A scale calibrated at normal incidence over-brightens grazing angles and pushes the lobe above the energy budget there, which is worse than the original error because it adds energy rather than removing it.
Second, a constant scale preserves the shape of the single-scattering lobe, which is the wrong shape for the missing component. Multiple scattering broadens the lobe: light that bounces twice has had two chances to be redirected, so it leaves over a wider angular range. Adding a scaled copy of the sharp lobe concentrates the correction where the original already was.
Third, a constant scale per color channel multiplies the Fresnel color into the correction twice or not at all, shifting the hue. A physically motivated correction must carry the right number of Fresnel factors, which for the second bounce is F², and F² is not proportional to F across wavelengths for a conductor, because F varies with wavelength.
The complement-lobe construction
The construction that production renderers converged on takes the deficit as a quantity to be computed, then adds a lobe whose directional albedo is exactly that deficit. Two pieces are needed: a tabulated or analytic E_ss, and a lobe shape for the multiple-scattering component.
The tabulation is the expensive part. E_ss depends on the incident angle, the roughness, and the Fresnel value, which is three dimensions per color channel. Because Fresnel varies from 0 to 1, one dimension can be normalized: rendering E_ss at a fixed Fresnel value and interpolating in it works well because the dependence on F is close to a low-order polynomial. A table of roughness by angle, at perhaps 32 by 16 samples with a Fresnel polynomial of degree three or four, is small enough to store in a lookup texture and smooth enough that bilinear filtering between its entries is not visible in the result.
The lobe shape is chosen so that its own directional albedo is simple. The usual choice is a diffuse-like lobe (cosine-weighted), because a Lambertian lobe’s directional albedo is its albedo by construction, requiring no second integral. So the correction term becomes
$$f_{ms}(\omega_i, \omega_o) = \frac{\left(1 - E_{ss}(\omega_i)\right)\left(1 - E_{ss}(\omega_o)\right)}{\pi, \left(1 - E_{avg}\right)} , F_{ms}$$
with E_avg the hemispherical average of E_ss, and F_ms an effective Fresnel factor for the multiple-scattering component. The symmetric product of deficits is what makes the term reciprocal: swapping the incident and outgoing directions leaves the expression unchanged. A term using only the incident deficit would depend on which direction the path traversed, which would break the adjoint relation between gathering and scattering described in the rendering equation as an operator.
The division by (1 − E_avg) is the normalization that keeps total energy at or below one. Without it, the correction slightly overshoots because the deficit computed for the single-scattering lobe does not account for the fact that the added light can itself scatter again. The denominator is the analytic sum of the geometric series of repeated diffuse bounces.
/* Complement-lobe correction. es_i, es_o are tabulated directional albedos
of the single-scattering lobe; es_avg is their hemispherical average. */
static double ms_lobe(double es_i, double es_o, double es_avg, double f_ms) {
double deficit_i = 1.0 - es_i;
double deficit_o = 1.0 - es_o;
double denom = 1.0 - es_avg;
if (denom < 1e-4) denom = 1e-4; /* guard against the lossless limit */
return (deficit_i * deficit_o * f_ms) / (3.14159265358979 * denom);
}
The guard matters. A perfect mirror with F = 1 has E_ss = 1 and E_avg = 1, so the denominator vanishes; the physically correct answer there is that there is no multiple-scattering component at all. Clamping the denominator keeps a numerically noisy table lookup from producing an enormous correction in exactly the case where none is needed.
What F_ms should be
The effective Fresnel factor for the multiple-scattering component is not F itself. Light that has bounced twice has been reflected twice, and the two reflections occur at different angles, so the effective factor is a weighted average of F over the distribution of bounce angles. Storage-friendly approximations fit it as a polynomial in F₀ and roughness, or use F_avg² raised to a roughness-dependent power.
For dielectrics the choice barely matters, because the whole correction is small. For conductors it is the difference between a correct hue and an obviously wrong one. Gold with the correction term using F rather than something like F² comes out too pale, because the second bounce’s attenuation is being underestimated in the blue where F is lower.
Heitz and colleagues take a different route entirely: they derive a multiple-scattering model that accounts for the full height distribution analytically, so no table is needed and the result is exact within the Smith model’s assumptions. That model is more expensive per evaluation and harder to fit into a shader that already has a table-driven pipeline, which is why the tabulated complement approach remains common.
Interaction with everything else
The correction is additive to the specular lobe, so it must be included when the lobe is composited with diffuse layers. A layered material that puts a rough specular coat over a diffuse base will propagate the corrected specular energy into the base’s transmitted budget; if the coat’s transmission is computed as 1 − F without accounting for multiple scattering in the coat, the base receives slightly too much light and the surface brightens.
The correction also changes the lobe shape enough to affect importance sampling. A sampling strategy fitted to the sharp single-scattering GGX lobe under-samples the broad correction term, which raises variance for paths that end up in the correction’s tail. Sampling the two components separately, with a probability split proportional to their relative energy, is the usual remedy; the general problem is treated in sampling BRDF lobes and choosing the pdf.
Finally, the tables are a data dependency. They must be generated with the same roughness parameterization, the same Smith variant, and the same Fresnel convention as the runtime shader. A mismatch of the GGX α-to-perceptual-roughness mapping between the table generator and the shading code produces a correction that is wrong by a smooth function of roughness. It is the hardest kind of error to spot in isolation, because every individual roughness value still looks like a plausible material.
References
- Revisiting Physically Based Shading at Imageworks — Christopher Kulla, Alejandro Conty, SIGGRAPH 2017 Course: Physically Based Shading in Theory and Practice
- Multiple-Scattering Microfacet BSDFs with the Smith Model — Eric Heitz, Johannes Hanika, Eugene d’Eon, Carsten Dachsbacher, ACM Transactions on Graphics, 2016
- Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs — Eric Heitz, Journal of Computer Graphics Techniques, 2014