What a scene does

Rendering in three numbers

Almost every renderer ever shipped bounces red, green and blue rather than a spectrum. The error that costs is exactly zero at the first product and grows at every one after it — because three numbers cannot carry a product they were never given the factors of, and each bounce is another product.

Assumes A bounce is a multiplication and Two paints that stop matching.

A renderer has to decide what a “colour” is before it can bounce one. Almost all of them decide it is three numbers, because three numbers are what a display takes, what a texture file holds, and what the hardware multiplies quickly.

The decision is defensible, it has been the default since the field began, and it is wrong in a way that is measurable, one-directional, and easy to attribute.

How far three channels drift from eighty-one, per bounceOne room, one geometry, one reduction to three channels, and the only thing changing is how many bounces of the Neumann series are kept. At one bounce the two agree to 2.5e-13 — the only reflectance in that path is the floor's, which is flat, and a flat reflectance is one of the few three numbers carry exactly. Every bounce after it multiplies another non-flat reflectance into the spectrum, and three numbers cannot carry a product they were never given the factors of. The curve levels off at ΔE00 = 2.38 because the light has run out, not because the disagreement has.00.511.522.5ΔE0013579bounces retainedsame room, same geometryCIE 1931 2° observer
Fig. 1 One room, one geometry, one reduction to three channels. The only thing changing along the axis is how many bounces of the series are retained. The two solves agree exactly at the first product and disagree at every one after it.

The claim

A three-channel solve is exact for a product it was handed the factors of, and inexact for every product it computes itself. Interreflection computes products, so the error appears at the second bounce and compounds.

The precise statement matters, because the usual framing — “RGB rendering is inaccurate” — is vague enough to be unfalsifiable and invites the usual reply, that the conversion to RGB is done properly and the error must therefore be small.

The conversion is done properly here. That is not where the error is.

Where the error is not

Set up the comparison carefully, because a strawman would prove nothing.

Both solves use the same geometry, the same form factors, and the same linear system. The reflectances are reduced to three channels the correct way — integrated against the colour-matching functions under equal-energy illuminant, expressed in linear sRGB, which is what a renderer’s albedo texture holds. The lights are converted the same way. Then the identical Neumann series is walked in both.

At one bounce the two agree to ΔE00=2.5×1013\Delta E_{00} = 2.5\times10^{-13}, which is double-precision arithmetic. That number is the control: it says the conversion, the geometry and the solver are not contributing anything.

The reason for exactness there is worth stating. The only reflectance in the path at one bounce is the floor’s, which is flat — and a flat reflectance is one of the few that three numbers represent perfectly, because scaling a spectrum by a constant commutes with integrating it. Everything downstream is the failure of that commutation.

The error, bounce by bounce

bounces spectral xyxy three-channel xyxy ΔE00\Delta E_{00}
1 0.3127, 0.3290 0.3127, 0.3290 0.000
2 0.3071, 0.3492 0.3084, 0.3492 0.627
3 0.3038, 0.3611 0.3065, 0.3606 1.089
4 0.3016, 0.3687 0.3057, 0.3674 1.505
6 0.2994, 0.3761 0.3052, 0.3736 2.038
10 0.2983, 0.3797 0.3051, 0.3760 2.381

Two things in that table are worth reading rather than skimming.

The disagreement crosses the threshold of visibility at the third bounce. A ΔE00\Delta E_{00} of 1 is roughly a just-noticeable difference under good conditions, and by three bounces the two renderers are past it.

The spectral solve keeps moving and the three-channel one stalls. Look at the xx coordinate: the spectral solve runs 0.3127 → 0.2983, the three-channel solve 0.3127 → 0.3051. The three-channel solve is not merely noisy about the right answer; it systematically under-saturates, because the product of two averaged channel values is closer to neutral than the average of the product.

The curve levels off at 2.38 because the geometric series has converged — the light has run out, not the disagreement. In a brighter room the series runs further and so does the error.

Where the two renderers put the floor, bounce by bounce. The same room solved twice — once in 81 bands and once in three channels — with the chromaticity of the floor plotted after each bounce. The two paths leave the white point together and separate; the spectral solve keeps going towards the wall's chromaticity while the three-channel one stalls, because after the first product it is multiplying numbers that no longer describe the spectrum they came from. Final separation ΔE00 = 2.38.
Fig. 2 The same two solves plotted on the chromaticity diagram. Both paths leave the white point together; the spectral one continues towards the wall’s chromaticity while the three-channel one stops short. The hatched region is what the display cannot show, marked rather than clipped.

What actually predicts the size of the error

The natural guess is that a room with more bouncing produces more error. Measured, that is not the strongest predictor.

Holding the geometry fixed and changing only the shape of the wall reflectance, at convergence:

wall reflectance ΔE00\Delta E_{00} at convergence
smooth sigmoid, red 0.41
saturated red band 0.98
two-lobed magenta 1.99
saturated green band 2.04

A factor of five, from nothing but how narrow the reflectance is. A three-channel renderer is nearly free in a room painted in broad pigments and expensive in one painted in narrow ones — and that is not a distinction any RGB workflow can express, because by the time the pigment is three numbers the information that would have predicted the error is gone.

The mechanism is the one this site keeps arriving at. Three numbers identify an equivalence class of spectra, and everything in that class matches under one illuminant and nothing else is guaranteed. A bounce is a change of illuminant — the surface hit next sees the previous surface as its light source — so a renderer that has collapsed to three numbers has already thrown away exactly what the next bounce needs.

Put that way, RGB rendering error is metamerism, applied by the renderer to itself. The three-channel solve replaces every reflectance with an arbitrary member of its metameric class and then asks what happens when the illuminant changes.

Why narrow reflectances are the expensive case

The dependence on spectral narrowness is worth deriving rather than tabulating, because it says how to predict the error without running the comparison.

Reducing a reflectance to a channel value is an integral: ρR=Eρrˉ/Erˉ\rho_R = \int E\,\rho\,\bar{r}\,/\int E\,\bar{r}, a weighted average of ρ\rho over the channel’s support. A bounce needs Eρσrˉ\int E\,\rho\,\sigma\,\bar{r} and the three-channel solve supplies ρRσR\rho_R\,\sigma_R instead — the product of two averages where the average of a product was wanted.

The gap between those is a covariance. If ρ\rho and σ\sigma vary together across the channel’s support, the average of the product exceeds the product of the averages; if they vary oppositely, it falls short. A broad, slowly varying reflectance has almost no variation within a channel and so almost no covariance, and the three-channel answer is nearly right. A narrow band that sits inside one channel has all its variation there, and the covariance is as large as it can be.

That gives the practical rule directly: the error scales with how much the reflectance varies within a single channel’s support, not with how saturated it looks. A reflectance that is a smooth ramp across the whole band can be extremely saturated and still cheap. A narrow spike is expensive even if it is weak.

A spectrum after 3 bounces off the same surface. The lamp's spectrum at the top, then the same spectrum multiplied by a reflectance peaking at 530 nm once for each bounce. Interreflection is elementwise multiplication, so light that reaches the eye by the long way round carries ρ raised to the number of surfaces it met. Each row's swatch is drawn at fixed luminance so only the chromaticity changes, and the distance from the D65 white point, printed at the right, rises from 0.000 to 0.446. The spectrum narrows every time, which is why a room painted in one colour is more saturated in its corners than on its walls.
Fig. 3 Three bounces off a narrow band. Each product multiplies the band by itself, so the spectrum collapses towards a single wavelength — and it is precisely this collapse that three channel values cannot follow, because they were fixed at the first step and have no wavelength axis left to narrow along.

It also explains why the two-lobed magenta costs nearly as much as the narrow green. Two lobes in different channels correlate strongly within each, and the second bounce weights them by their own heights, which is exactly the case an average-per-channel destroys.

What was computed, and how

The series is walked rather than inverted. solve inverts (Idiag(ρ)F)(I - \mathrm{diag}(\rho)F) and gets the converged answer at once, which is what a real renderer wants and which cannot answer the question “when does the error appear”. Walking the Neumann series term by term costs more and isolates the bounce count exactly.

Both solves share one series implementation. The spectral and three-channel runs differ only in the function that multiplies incident light by a surface — per band in one, per channel in the other. Two implementations would have risked the comparison measuring a difference between them.

The first version of this measurement was weaker and was replaced. It varied the walls’ albedo and asserted the error grew with it. The error did grow — from 0.14 to 0.98 — but a room’s albedo changes several things at once, and a reviewer would have been right to say the number proved nothing about which. The bounce-count version changes one thing.

Both results are put on the same luminance scale before comparison. The argument is about chromaticity and relative lightness, not about an exposure, and normalising is what makes that true rather than assumed.

What this costs in practice

The honest summary is that for most rendering this does not matter, and the cases where it does are identifiable in advance.

It does not matter much for: broad natural reflectances, scenes with little interreflection, outdoor scenes lit mostly by one direct source, and anything where the output is going to be graded by hand anyway.

It matters for:

  • Interiors with saturated finishes. A room with a strong accent wall is exactly the two-lobed or narrow-band case, in exactly the geometry that bounces most.
  • Narrow-band lighting. LEDs and fluorescent tubes have spiky spectra, and what a lamp cannot give back it cannot be given credit for. A three-channel renderer under a three-peak lamp is compounding two separate collapses.
  • Anything that has to predict a measurement. Architectural lighting simulation, paint visualisation and any workflow whose output is compared against a real sample built later. A 2 ΔE\Delta E systematic bias is inside the tolerance a paint would be rejected for.
  • Fluorescence and dispersion, which three channels cannot express at all rather than merely getting wrong — the energy moves between wavelengths and there is no wavelength axis left to move it along.

What the pictures cannot show

The figures on this page understate the effect twice over, and both directions are worth naming.

The disagreement is shown on a display that cannot reach either answer. The room’s converged chromaticity sits outside the sRGB triangle, so the swatches for the most-bounced faces are hatched rather than filled — the unreachable region marked rather than approximated. A reader therefore cannot see the difference the numbers describe, and no arrangement of this figure on this medium could show it.

Two solves that disagree by 2.4 ΔE\Delta E look identical side by side once both are clipped into gamut. That is not a limitation of the drawing; it is the reason the error survived four decades of visual inspection. A renderer is judged by whether its output looks convincing, and an under-saturated bounce looks entirely convincing. There is nothing in a rendered image to compare it against — which is why the comparison here is against a second computation rather than against a picture.

How far three channels drift from eighty-one, per bounce. One room, one geometry, one reduction to three channels, and the only thing changing is how many bounces of the Neumann series are kept. At one bounce the two agree to 2.5e-13 — the only reflectance in that path is the floor's, which is flat, and a flat reflectance is one of the few three numbers carry exactly. Every bounce after it multiplies another non-flat reflectance into the spectrum, and three numbers cannot carry a product they were never given the factors of. The curve levels off at ΔE00 = 1.51 because the light has run out, not because the disagreement has.
Fig. 4 The first four bounces alone. Most real interior renders converge in this range, so this is the part of the curve that describes ordinary work: exact, then 0.63, then past the threshold of visibility, then 1.5.
Where the two renderers put the floor, bounce by bounce. The same room solved twice — once in 81 bands and once in three channels — with the chromaticity of the floor plotted after each bounce. The two paths leave the white point together and separate; the spectral solve keeps going towards the wall's chromaticity while the three-channel one stalls, because after the first product it is multiplying numbers that no longer describe the spectrum they came from. Final separation ΔE00 = 1.51.
Fig. 5 The same four bounces as a path on the chromaticity diagram. The two solves have already separated inside the range a render actually visits, so the disagreement is not something that only appears in a limit nobody computes.

Two more readings say that the drift is monotone in the bounce count and that the chromaticity path does not turn back on itself.

How far three channels drift from eighty-one, per bounce. One room, one geometry, one reduction to three channels, and the only thing changing is how many bounces of the Neumann series are kept. At one bounce the two agree to 2.5e-13 — the only reflectance in that path is the floor's, which is flat, and a flat reflectance is one of the few three numbers carry exactly. Every bounce after it multiplies another non-flat reflectance into the spectrum, and three numbers cannot carry a product they were never given the factors of. The curve levels off at ΔE00 = 2.04 because the light has run out, not because the disagreement has.
Fig. 6 Six bounces rather than four or ten. The two solves separate at every step, so a render that stops early has a smaller error rather than a different one.
Where the two renderers put the floor, bounce by bounce. The same room solved twice — once in 81 bands and once in three channels — with the chromaticity of the floor plotted after each bounce. The two paths leave the white point together and separate; the spectral solve keeps going towards the wall's chromaticity while the three-channel one stalls, because after the first product it is multiplying numbers that no longer describe the spectrum they came from. Final separation ΔE00 = 2.38.
Fig. 7 And the whole path on the chromaticity diagram. It leaves the white point in one direction and keeps going, which is what makes the three-channel error a bias rather than a scatter.

Where the model stops

Six faces and one lamp. A real scene has thousands of surfaces and the error accumulates along much longer paths, so the numbers here are a floor rather than an estimate.

Radiosity, so diffuse only. A path tracer with glossy transport bounces light differently but multiplies the same reflectances, and the spectral argument is untouched. The magnitude would change; the mechanism would not.

The reduction to three channels is the best one. Renderers in practice do worse — albedo textures are usually authored in a display space and sometimes bounced without linearising at all, which adds an error that has nothing to do with anything on this page and is much larger.

No fluorescence and no dispersion. Both are the interesting cases and both are outside the model, which is a limitation stated rather than an oversight: the machinery here carries a spectrum through multiplication and neither of those is a multiplication. Fluorescence moves energy from one wavelength to another, so it needs a matrix where this has a vector; it is already a declared floor everywhere on this site because the excitation band runs below 380 nm.

And the observer is fixed. Every number here is under the CIE 1931 2° functions. The disagreement between the two solves is a difference between two arriving spectra and does not go away under other functions, but its size in ΔE00\Delta E_{00} would move — and which functions are used is a choice this site keeps arriving at rather than a formality.

The generalisation

The result is one instance of a rule with a wide reach: a lossy projection is safe under operations it commutes with and unsafe under the rest, and the count of unsafe operations is what determines the error.

Reducing a spectrum to three numbers commutes with addition and with scaling by a constant. It does not commute with multiplication by another spectrum. So the error in any pipeline is not a property of the projection’s quality but of how many non-commuting operations happen downstream of it — which is a question about the process, not about the representation.

The practical test transfers directly. When somebody proposes compressing a quantity early in a pipeline, the question that decides whether it is safe is not “how much information is lost” but “how many operations downstream are nonlinear in the thing being compressed”. If the answer is zero the compression is free. If it is one, it is measurable. If the process iterates, the error compounds and the compression was a mistake.

Who found it, and when

Radiosity arrived in graphics in 1984 from Cornell, and the colour bleeding it demonstrated is the phenomenon this whole field is about. The original implementation carried three channels.

Spectral rendering has a long history of being repeatedly rediscovered and repeatedly abandoned on cost grounds. Hall and Greenberg raised it in the early 1980s; Meyer and others worked on how few samples would do; Peercy’s 1993 paper on linear colour representations gave the framework for asking how many basis functions a scene actually needs. The recurring finding across that literature is the one measured here — the answer depends on how spiky the spectra are, and three is enough only when they are smooth.

What changed the economics was not a new argument but a new requirement. Physically based rendering for film and for product visualisation raised the bar from “convincing” to “predictive”, and a predictive answer has to match a measurement made later on a real object. Hero-wavelength spectral sampling, now standard in production renderers, is a response to that rather than to any of the older papers.

The colorimetric half was settled long before any of it. That three numbers are an equivalence class rather than a description is the content of metamerism, understood since the nineteenth century, and Grassmann’s laws are explicit that the linearity they assert is for additive mixture.

Eight bounces is between the two the essay reports and says whether the separation is smooth in the bounce count.

How far three channels drift from eighty-one, per bounce. One room, one geometry, one reduction to three channels, and the only thing changing is how many bounces of the Neumann series are kept. At one bounce the two agree to 2.5e-13 — the only reflectance in that path is the floor's, which is flat, and a flat reflectance is one of the few three numbers carry exactly. Every bounce after it multiplies another non-flat reflectance into the spectrum, and three numbers cannot carry a product they were never given the factors of. The curve levels off at ΔE00 = 2.28 because the light has run out, not because the disagreement has.
Fig. 8 One room, one geometry, one reduction to three channels, with only the number of bounces of the Neumann series changing. At one bounce the two agree to 2.5 × 10⁻¹³, because the only reflectance in that path is the floor’s.

The two solves converge at different rates, which is a stronger statement

The table’s flattening is explained above by the geometric series running out — the light has run out, not the disagreement. That reading is right about the mechanism and it can be sharpened, because the two columns do not run out at the same rate, and if the only thing happening were one series terminating they would have to.

Fitting each x coordinate to the form xn=x+Arnx_n = x_\infty + A r^n from the readings at two, three and four bounces gives a per-bounce ratio of 0.667 for the spectral solve and 0.421 for the three-channel one. Those are the same room, the same form factors and the same overall albedo; the only difference is what a surface multiplies. So the three-channel solve is not the spectral solve stopped early. It is a series with a smaller ratio, converging to a different place sooner.

The reason follows from the covariance argument two sections above. A spectral bounce narrows the band it is multiplying, so each product moves the chromaticity nearly as far as the last one did and the ratio stays high. A three-channel bounce multiplies three fixed numbers by three fixed numbers, so the channel ratios approach a fixed point geometrically and the chromaticity stops moving. The three-channel solve has a limit because its state has three degrees of freedom and they saturate; the spectral solve keeps finding new places to go because its state is still a spectrum.

The converged disagreement is larger than the table’s last row

That has a consequence for the headline number. Extrapolating both fits to their limits puts the spectral solve at (0.2972, 0.3821) and the three-channel one at (0.3051, 0.3775), a chromaticity separation of 0.0092 — against 0.0077 at ten bounces.

Ten bounces has therefore reached about 84 per cent of the converged disagreement, not all of it. The 2.381 in the last row of the table is not the answer at convergence; it is the answer at ten terms, and the converged figure is roughly a fifth larger. The essay’s own sentence is the correct one — the light runs out before the disagreement does — and the table stops one step before making it visible.

The chromaticity path at six bounces is the shortest one that shows the two solves leaving the white point together and not coming back.

Where the two renderers put the floor, bounce by bounce. The same room solved twice — once in 81 bands and once in three channels — with the chromaticity of the floor plotted after each bounce. The two paths leave the white point together and separate; the spectral solve keeps going towards the wall's chromaticity while the three-channel one stalls, because after the first product it is multiplying numbers that no longer describe the spectrum they came from. Final separation ΔE00 = 2.04.
Fig. 9 The same room solved twice — once in 81 bands and once in three channels — with the floor’s chromaticity plotted after each bounce. The two paths leave the white point together and separate, and the spectral solve keeps going.

A third of the growth is the unit, not the solve

One more reading, and it is the one that connects this essay to the collection’s standing argument about what a colour difference is.

Dividing each row’s ΔE00 by the Euclidean chromaticity separation behind it:

bounces separation ΔE00 ratio
2 0.00130 0.627 482
3 0.00275 1.089 397
4 0.00430 1.505 350
6 0.00632 2.038 323
10 0.00774 2.381 308

The ratio falls by 36 per cent down the table. In chromaticity units the two solves separate by a factor of 5.95 between the second bounce and the tenth; in ΔE00 they separate by 3.80. The missing factor of 1.57 is the metric’s chroma weighting, which divides a chroma difference by the chroma at which it was measured — and every bounce carries the pair further from the white point, so every bounce buys the same physical separation at a lower price in reported units.

The three-channel error is therefore growing faster than the published column shows, and the column is not wrong: it is reporting how visible the error is rather than how large it is, which is what a perceptual unit is for. But the two readings support different sentences. The error grows roughly fourfold across the series is a claim about visibility. The two solves’ answers separate sixfold is a claim about the transport, and it is the one the covariance mechanism predicts.

Where the ladder goes next

Two neighbours on this rung look at the same transport from other angles. What a white wall costs takes the interreflection gain seriously and finds a nearly neutral paint acting as a strongly coloured illuminant. A corner is not a wall is about where the form factors come from and what they guarantee.

The rung above leaves transport for materials, where the multiplication stops being the right model at all: paint is not a filter, and mixing pigments is a linear operation in a space that is not reflectance.

What this makes readable

Essays that name this one as a prerequisite.

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

The 8 essays that link to this one and share the most of its objects, of 12 that link here.

The objects this essay names

Each one links to every other essay that touches it.

ChromaticityColour managementΔEInterreflectionMetamerismPrimariesRadiosityReflectanceSpectral renderingStandard observer