Where the model breaks

Where a patch stops being a point

A patch in a cube subtends a cone of 25.8° at the face opposite. A microfacet lobe of roughness 0.05 is about three degrees wide. Point-sampling the second inside the first returned a chroma of thirty-four thousand and a negative lightness, and the boundary between working and not working is measured rather than declared.

Assumes Thirty unknowns instead of six, The audit that changed the object and How far a quadratic can be believed.

Every model has a boundary and most of them are described rather than measured. This one is measured, and the measurement is a good deal more useful than the description would have been.

Where a point-sampled patch stops resolving a lobe. The horizontal axis is the wall's roughness, logarithmic; the vertical is how far the answer moves when the cone quadrature is refined from eight directions to sixteen, also logarithmic. A patch in a cube subtends a cone of angular radius 25.8° at the face opposite, and a microfacet lobe of roughness a is about a radians wide, so a lobe below about 0.15 is narrower than the quadrature that samples it. The movement at 0.05 is 21.2 ΔE₀₀ and at 0.3 it is 0.033. This is where the method stops, not where the paint does: matt, eggshell and satin finishes are inside it and a high-gloss varnish is not.
Fig. 1 Where the point-sampled patch stops resolving the lobe, measured by refining the cone quadrature and watching the answer move. At roughness 0.05 it moves by 23 ΔE₀₀; at 0.3 by 0.03.

The claim

A directional solver whose patches are points cannot resolve a lobe narrower than the cone a patch subtends, and the boundary is at roughness 0.15 for a cube — measured, not asserted.

  • A patch in a cube subtends 25.8° of angular radius at the face opposite, computed from the form factor rather than from the geometry.
  • A microfacet lobe of roughness a is about a radians wide, so roughness 0.15 is about eight and a half degrees and roughness 0.05 is under three.
  • Refining the quadrature moves the answer by 23.3 ΔE₀₀ at roughness 0.05 and by 0.03 at roughness 0.3, and the boundary is read off that sequence.
  • Below it the answers are unphysical rather than imprecise. The first version of this solver returned a chroma of thirty-four thousand and a negative lightness, which is the honest failure mode and is the one that gets noticed — unlike an answer that is merely wrong by a plausible amount.

The mistake, first

The obvious reading of “a patch is a point” is to evaluate the bidirectional distribution at the two centre directions: the direction light arrives from and the direction it leaves towards, both taken between patch centres.

That is a one-point quadrature of a function that can vary by orders of magnitude across the cone being integrated. Two patch centres in a cube happen to sit near a mirror direction for several pairs, and a microfacet distribution near a mirror direction goes as the inverse square of the roughness — so at roughness 0.02 the sampled value is enormous, the transport takes it as though the whole patch were that bright, and the linear system solves for something with no physical interpretation.

The symptoms were unmistakable once looked at: chroma 261 at roughness 0.1, chroma thirty-four thousand and lightness minus nineteen thousand at 0.05. Neither is a large error; both are answers to no question.

A one-point quadrature is a modelling decision disguised as a discretisation, and whether it is acceptable depends entirely on what is being integrated, which is a property of the integrand rather than of the geometry.

The repair is a cone average, and it moves the boundary rather than removing it. The repair is to average the lobe over the cone each patch actually subtends, in both the incoming and the outgoing direction.

The cone’s solid angle is read off the form factor rather than computed from the geometry, and that is worth noting: κ_ik = π F_ik is the cosine-weighted solid angle patch k occupies at i, so Ω = κ / cos θ and the cone’s angular radius follows. The solver already had the number.

The cone is then sampled at its centre plus three rings of twelve, giving thirty-seven directions in each of the two cones and about thirteen hundred bidirectional evaluations per patch triple. That is enough for a lobe comparable with the cone and not enough for one much narrower, because no finite quadrature resolves a feature far below its own spacing.

So the repair moves the boundary rather than removing it, and the honest thing is to find out where the boundary now is.

What the Lambertian assumption costs a room, against how rough its walls are. The horizontal axis is the roughness of the two coloured walls; the right-hand end is nearly matt, which is what a radiosity calculation assumes. One line is the distance in ΔE₀₀ between the floor's colour and what radiosity gives for the same room — 4.89 at an eggshell finish, falling to 0.97 at the matt end. The other is the chroma of the bounce, which falls as the walls get glossier: what an interface returns is a Fresnel reflection and carries no pigment, so the fraction of the return that goes into the lobe is a fraction that arrives at the floor white. The lobe is taken out of the body term rather than added beside it, which is what a real finish does.
Fig. 2 The roughness sweep, which begins at 0.15 rather than at zero. The left-hand end of the axis is where the model stops, not where the paint stops.

Measuring the boundary

The measurement is to compute the same answer at two quadrature refinements and see how far it moves. A roughness whose answer is stable under refinement is one the model can report; one whose answer moves is not.

wall roughness movement under refinement
0.05 23.27 ΔE₀₀
0.10 2.806
0.15 0.722
0.20 0.234
0.30 0.0335
0.45 0.0105

The sequence falls by roughly a factor of three per step, which is what a quadrature error should do as the integrand becomes smoother relative to the sampling. Nothing about it is surprising and the value of it is that it puts a number where a judgement would have been.

The boundary is chosen at 0.15, where the movement is 0.72 ΔE₀₀ — comparable with the smallest departure the solver is being used to measure, which is 0.97 at nearly matt. Below that the movement exceeds what is being reported and the model is measuring its own quadrature.

That choice is a judgement and it is a judgement about a measured sequence rather than about a geometry, which is the difference this essay is about.

Why the boundary is a real limit rather than a tuning parameter

A reader might reasonably ask why the quadrature is not simply refined further, and the answer is that it can be and it does not help much.

The cone’s angular radius is fixed by the geometry: 25.8° for opposite faces in a cube, and similar for the adjacent ones. Resolving a three-degree lobe inside a 25.8° cone needs an angular resolution of about a degree, which is roughly seven hundred directions per cone and half a million bidirectional evaluations per patch triple — a factor of four hundred over the current cost.

That is affordable and it would still not be right, because the model’s commitment is not only about the quadrature. A patch is being treated as a point, and a real patch at roughness 0.05 has a spatially varying return across its own extent — the near end of a wall sees the mirror direction and the far end does not. Averaging the lobe over the cone approximates that and does not capture it.

The limit is the patch discretisation rather than the angular one, and the repair for it is more patches, which is a different solver. That is why the boundary is stated as where the method stops rather than as a setting.

Where the viewer stands, at a wall roughness of 0.2. The chroma of the light the floor sends towards each of the five other faces of the room, at one roughness. The spread is 2.00 ΔE₀₀ between the extremes. A radiosity solution assigns one radiosity to the floor and therefore cannot have a spread at all — the whole width of this chart is a quantity the method has no slot for, rather than one it approximates badly. The two side walls see the most because they are where the coloured light comes from, and the direction the lobe favours is the direction it came from.
Fig. 3 The five viewing directions at roughness 0.2, which is comfortably inside the boundary. The spread of two colour differences is a result the model can report.

Everything this round publishes about scenes lies to the right of the boundary, and the figures are drawn so that the left-hand end of every roughness axis is 0.15 rather than zero. That is a small editorial decision with a purpose: an axis that began at zero would invite a reader to extrapolate into the region the model cannot report, and extrapolating a curve that rises steeply towards a boundary is exactly the wrong thing to do.

The published range is also where nearly all architectural coatings sit, so the restriction costs less than it might. What it costs is the case where the effect would be largest, which is the shape of every restriction in this collection: the boundary of a method tends to sit exactly where the phenomenon becomes interesting.

What is inside the boundary and what is not

The range from 0.15 to 0.8 covers most architectural and industrial coatings. A flat wall paint is around 0.6 to 0.8; an eggshell or satin finish is 0.15 to 0.3; a semi-gloss is around 0.1.

Outside it are the finishes anybody would call glossy: a gloss enamel at 0.05, a varnish at 0.02 to 0.04, a polished metal or a mirror at effectively zero. Those are exactly the surfaces where the effect would be largest, and this model cannot report them.

That is a real limitation and it is worth being blunt about which way it cuts. Every number in this round’s scene work is a lower bound, because the surfaces the model cannot reach are the ones with the strongest lobes. A room with gloss-painted joinery or a lacquered table has a departure from the Lambertian answer larger than anything measured here, and how much larger is not known.

The directional solver reduces to the radiosity solver exactly. A solver with a new unknown in it is worth nothing until it reproduces the one it replaces. Setting every wall's bidirectional distribution to ρ/π collapses all thirty ordered-pair radiances onto their patch's radiosity divided by π, and the answer agrees with this collection's existing radiosity solution to 9.8e-16 relative — the floating-point floor. That is the check that makes every other number in this family a statement about lobes rather than about a new piece of arithmetic, and it is the reason the reduction is drawn rather than mentioned.
Fig. 4 The reduction check, which holds at every roughness including the ones the model cannot report — because with the lobe removed there is no lobe to resolve.

Why the reduction check does not catch it

The reduction check is exact and it is silent about this boundary, which is worth understanding because it is a general property of limit checks.

Setting the lobe to zero removes the thing the quadrature was failing to resolve, so the check passes at every roughness — it is not a check on the lobe at all, it is a check on the geometry and the linear algebra. A solver could reduce perfectly and still be nonsense at every non-zero roughness.

That is why two checks are needed and why they are different in kind. The reduction verifies the machinery against a known answer; the refinement verifies that the machinery’s new degrees of freedom are being computed rather than guessed. Passing one and not the other is a specific and common failure.

The general form: a limit check tests the model at the point where the new feature is absent, which is the one place the new feature cannot be wrong. It is necessary and it is never sufficient.

The same shape, twice before

This collection has now made the same mistake three times, in three different quadratures, and the pattern is worth naming.

The hemisphere quadrature was passing its convergence check by luck: forty by ninety-six and ninety-six by two hundred and fifty-six agreed to a part in ten thousand on the sharpest lobe in the file, and both were sampling that lobe at a node. Rotating the light moved the answer by two and a half per cent.

A quadratic was believed further than it could be: a local expansion checked at points near its centre and used at points far from it.

And here a one-point quadrature was applied to an integrand that varies by orders of magnitude across its cell.

The common element is that a convergence check tests the parameter it refines and nothing else. In the first case refining the grid and not rotating the light; in the second, checking near the centre and not far from it; in the third, refining nothing at all because a single point has no refinement. Each time the fix was to vary something the answer should not depend on.

The lobe's share of what leaves a surface of body reflectance 0.5. For light arriving at 45°, the fraction of what leaves the surface that is the interface's Fresnel return rather than the pigment's. It runs from about 9.1 per cent at an eggshell finish down to 4.2 at a matt one. That is a small share, and it is the whole of the effect: a tenth of the return arriving white is enough to move the room's colour by units of ΔE₀₀, because the bounce is what a room's colour is made of and every bounce is multiplied by the next.
Fig. 5 The lobe’s share of the return at each roughness. The share is well behaved everywhere; it is the lobe’s width that the quadrature cannot follow, and the share says nothing about the width.

That figure is worth putting beside the resolution one because it shows what a check on the wrong quantity would have concluded. The lobe’s albedo is a smooth, gently-varying function of roughness all the way down to 0.02, computed by a hemispherical quadrature that resolves it perfectly well — so a solver that checked its lobe by integrating it would find nothing wrong at any roughness.

The failure is not in the lobe. It is in the transport, where the lobe is evaluated between two specific directions rather than integrated over a hemisphere, and a quantity can be perfectly integrable and badly point-samplable at the same time.

A component can pass its own checks and fail inside the assembly, which is why the refinement test is run on the solver’s output rather than on its parts.

What was computed, and how

The two refinements are eight directions per ring with two rings, and sixteen directions per ring with five rings — so thirty-three against eighty-one sample directions per cone, and roughly a sixfold difference in the number of bidirectional evaluations.

The comparison is the colour of the floor’s return towards the front of the room, which is the same quantity every other figure in this family reports, so the movement is directly comparable with the departures being measured.

The assertion the figure carries requires the movement to fall monotonically as the lobe widens. That is a shape claim rather than a tolerance and it could fail — a solver with a bug in its cone construction would very likely produce a non-monotone sequence.

A stated boundary is worth more than a described one. There is a case for measuring a boundary rather than describing one that goes beyond tidiness, and it is about what a reader can do.

A described boundary — this model is unsuitable for very glossy surfaces — leaves every judgement to the reader and gives them nothing to judge with. Is a semi-gloss paint very glossy? Is a satin finish? The description cannot say, and a reader who guesses wrong gets an answer with no warning attached.

A measured boundary is a number the reader can compare against their own case. Roughness 0.15 is a stated place on a stated scale, the sequence approaching it is published, and anybody with a coating specification can decide whether they are inside it.

The cost of measuring it was one extra run of a solver that already existed. That ratio — a large gain in usability for a small addition of work — is why this collection tries to put a number on every limitation it states, and why an unmeasured caveat is treated as an unfinished one.

Where the model stops

This essay is where the model stops, and the remaining limits are the ones stated in the solver’s own account: patches are points, the room is a cube of six flat faces, the lobe is isotropic, dielectric and single-scattering.

The boundary is measured for a cube. A room of different proportions has different form factors and therefore different cone radii, so the boundary moves — a long thin room has smaller cones between its distant faces and a lower usable roughness, and a nearly cubical one has the boundary computed here.

And the boundary is measured on one quantity, the floor’s return towards the front. Another quantity might be more or less sensitive, and no survey of that has been done.

One consequence for how the round’s scene numbers should be read follows directly and it is the reason this essay sits where it does. Every departure reported in the scene work is measured at a roughness the solver can resolve, so every one of them is a lower bound on what a glossier surface would give — and the curve rises steeply towards the boundary, so the bound is not a tight one.

That is stated in each essay’s own limits section and it is worth having in one place: the departure at eggshell is 4.89 ΔE₀₀, the curve is still rising at the left-hand end of the axis, and what a gloss enamel would give is unknown rather than small. The lobe’s share reaches half on a dark sample, which is where the largest effects would be.

The generalisation

The habit is about knowing what a discretisation integrates over.

Replacing an extended object by a point is a quadrature of one node, and its accuracy depends on how much the integrand varies across the object. That variation is a property of the physics being modelled rather than of the mesh, so the same mesh can be perfectly adequate for one material and catastrophic for another — which is exactly what happened here, where a Lambertian wall and a glossy one differ only in a parameter.

The move is to measure the boundary rather than to argue about it. Refine the discretisation, watch the answer, and report the roughness at which the movement exceeds what is being reported. It costs one extra run and it converts a caveat into a number.

The failure mode is to state the limitation in prose and let the reader judge. A limitation without a number is a limitation nobody can act on, and it is usually stated because measuring it looked like more work than it is.

Who found it, and when

Quadrature error in radiosity form factors has been studied since the method arrived in graphics, and the standard treatments are about the geometric term rather than about the reflectance — the same distinction between a form factor and what it multiplies that this collection had to make when the form factors were written. Directional methods have the problem this essay is about and the graphics literature’s answer was to move to path tracing, where a lobe is importance-sampled rather than integrated over a fixed grid.

Importance sampling is the right answer and it is not available here, because the solver’s unknowns are indexed by patch pairs and there is no path to sample along. A method whose discretisation is fixed by its unknown has to resolve everything with that discretisation, which is the structural reason directional radiosity was abandoned.

Where the ladder goes next

The solver’s boundary is measured and its results stand inside it. What remains is to say how small the driving quantity is: a tenth of the return arriving white is enough to move a room by five colour differences, and that ratio is worth understanding on its own.

Named alongside this one

Essays reaching for the same objects. Nobody chose these; they are what the index of named objects makes visible.

What links here

Every essay whose body links to this one.

The objects this essay names

Each one links to every other essay that touches it.

AuditBidirectional reflectanceConvergenceFalsificationForm factorMeasurement errorModelling assumptionQuadratureRadiositySpecular