立体角与渲染方程
The last note owned Monte Carlo sampling mismatch: same integral, two pdfs, one . Those pdfs were already densities in . Split-sum had already folded an environment into a GGX prefilter DFG LUT and left the measure inside the integral (env solid-angle mean luma 1.628 on that loft run). This note owns the measure.
Path tracers sample . Irradiance and the rendering equation track . A direction is a point on the hemisphere, weighted in steradians. Flux through a flat surface uses the projected solid angle . Source area, pixel count, and used as a brightness knob are the wrong meters.
The importance-sampling key was a finite disk of angular radius 3.600°. The solid angle that disk subtends, which that note never printed, is
A hemisphere pdf against a cap that small is why a cosine sample fireflies a highlight. Cited here. The cosine-versus-Phong comparison stays in that note.

A new photographic family: sunlit courtyard / skylight atrium — not the loft cream-glaze bottle / measured-brass / dark-oak still, not the metro colonnade, not the gallery lacquer sphere. Four walls, a square skylight with a visible jamb, matte limewash floor, one low bench for scale. An analytic sky disk sits in the opening: spherical cap of locked half-angle , uniform radiance. White Lambert card , , , on the floor under the opening. The card is the instrument. HUD: path tracers sample d omega E tracks Omega_perp. Do not hang on this photograph.

Pin this. Same camera, same exposure, same . Left . Right . The right-hand card integrated more steradians. Lower caption: only Omega changes; brightness change IS the lesson, and with the same- control. Upper line: area is not Omega; pixels are not steradians. Photo only.
Hero, Mesa 25.0.7 llvmpipe, linear Rec.709, Khronos PBR Neutral , seed 1352782172: , , ratio 8.954394. , . Disk irradiance ratio . The small-angle stand-in is rejected as the meter. Same- area control: ratio 3.536. bit-identical A/B; ; disk/fill -ratio 200. Assertions 28 pass / 0 fail.
What you are seeing
Working space is scene-referred linear Rec.709. One courtyard, one analytic cap, one Lambert card. Display is inherited: Khronos PBR Neutral, , then IEC 61966-2-1 sRGB OETF on CPU. The curve still does not create lighting. Neutral still does not author . Cite the tone-mapping and split-sum IBL notes.
Hero — presentation hook. Atrium, visible disk, white card, low bench, . Photo of the family. The meter is not this JPEG.
Size A/B — teaching pin. A | B, same , vs , shared exposure. Quote the metrics for the digits.

Cosine tilt — Failure B. Same disk held fixed in world. Left: card , . Right: card tilted . frozen. Plate caption: (n·ω) is geometry, not a brightness slider. Photo only.

Grid — the measure. Unit hemisphere over the card. Equal- cells, sky cap as a spherical polygon. Plate caption: the measure, not a latlong unwrap.

vs — the identity. Horizontal axis in sr. Cyan: disk . Gold: disk plus named fill. Red ghost: , cosine missing. Squares: cosine-arm , inverted through Lambert. Plate caption: irradiance tracks projected solid angle.

Wedge — the article. Same cap twice, side view. Left: steradians on the sphere. Right: foreshortened patch. Plate caption: at 5 deg they almost agree; at 15 deg the article appears.

MC- — estimator of that integral. Card center, , . Thumbnails are the cosine- instrument. The plot is uniform- (cyan) and cosine- (gold), same stream. Plate caption: not an IS bake-off; rel_err must fall. The traces are allowed to rise at . The gate is the fall at .

Metrics strip — the meter, snapshot. Science plate of the float-buffer table. Quote the text metrics, not the JPEG.
Two facts, never mixed:
- Beauty plates (
00,01,02) are the GLSL courtyard on this llvmpipe, Neutral then sRGB OETF. The shader shades walls, floor, and the card with a disk form factor. Do not invent , , or from the JPEG. - Instruments (
03,04,05,06,07, and the metrics) are the float identities and the CPU estimator. Quote the metrics.
Three failures
Radiance is power per area per steradian. Irradiance on a plate is radiance times the projected solid angle of the source. Grow the cap and keep fixed: the card changes. Tilt the card and keep and the cap fixed: the card changes again, because moved. Neither change is a hotter source.
Failure A — area versus . It lives on the size A/B plate. Left , right , on both, , . The right card is brighter because grew from 0.023863926 sr to 0.210446804 sr. The disk irradiance ratio is . The lower caption names the rejected stand-in: .
The same caption carries the area control, which is not a second photograph. On-axis disk, radius , distance , ,
From the metrics, , area on both rows:
| area | [sr] | |||
|---|---|---|---|---|
| 1 | 2 | 0.663334 | ||
| 1 | 4 | 0.187600 |
Area identical. Recorded ratio . Inverse-square in distance at fixed radius would report . The assert rejects 4. Scale and by the same and is unchanged while area scales by . Equal area is not equal solid angle. Equal solid angle carries no claim about area.
Failure B — missing cosine. It lives on the cosine-tilt plate, and as a curve on the vs plot. Integrating without collects flux as if the receiver were a spherical probe. The rendering equation on an opaque surface is the flat-plate integral. is foreshortening of the incoming beam. It is not a brightness slider and it is not the BRDF. On the tilt plate the disk stays put and the card tilts to . The right card goes dark at the same . The red ghost on the identity plot is drawn against . Raising to lift the dark card voids the control.
Failure C — pixels versus steradians. The upper line of the size plate already says so. Pixel coverage is a camera projection of the drawn sky disk. Solid angle in the rendering equation is at the card. The two stored counts are not a matched pair. pixels_disk_A 910 is a luma threshold on the linear panel at . pixels_disk_B 7242 is the same kind of count on the hero at . Both lines are tagged omega_from_pixels_illegal. Different frame size, different aspect, and the right-hand panel of the size plate is not the image that produced 7242. Dividing the two integers does not estimate . A cap is at 910 px and at any other footprint. Frame size moves the count. It does not move card .
The importance-sampling key is Failure A at a still smaller cap. 3.600° subtends 0.012398431 sr. That note’s cosine pdf spends its mass on the hemisphere around , not on that cap. This note prints the steradian.
The rendering equation once
Write it once. Name every symbol. Later lines evaluate this integral. They do not rename it.
| symbol | name | unit |
|---|---|---|
| outgoing radiance | (linear Rec.709 RGB in the lab) | |
| emitted radiance | same; 0 on the card and floor | |
| incident radiance | same; piecewise-constant sky disk + dim fill | |
| BSDF | ; Lambert on card and floor | |
| geometric unit normal | dimensionless | |
| incoming direction, toward the source | unit vector, | |
| outgoing direction | unit vector | |
| hemisphere about | ||
| solid-angle measure |
A path tracer samples this integral: draw , weight by . Building the tracer is a different note. What this one locks is the measure is a density of.
, then projected solid angle
is polar angle from . is azimuth in the tangent frame.
The second form is the grid. Equal steps of and of are equal steradians. The polar step that realizes a fixed is , wide near the pole, packed near the horizon. A lat-long that is even in is even in the picture and uneven in : its cells scale with and collapse at the pole. Sampling from a uniform angle is not sampling solid angle. The inverse CDF for uniform on is , .
Full sphere . Hemisphere . This run: sphere_sr 12.566370614, hemisphere_sr 6.283185307. Neither number is . is the projected hemisphere:
A sky of constant radiance over all of delivers irradiance . The count of directions is the wrong meter for a flat plate. That factor is geometry. It is already in the integral, before .
E_analytic_* below is this lab’s scalar: Rec.709 luma of times . The plates label that axis . It is not a spectrally integrated pyranometer reading.
The cap, then one bounce
On-axis spherical cap, , , constant on the cap:
is the area of the disk of radius in the tangent plane. That disk is the right-hand drawing on the wedge plate. The ratio of the two closed forms is the identity printed on that plate:
because and . At the locked pair the quotient of the metrics tokens is the same identity: 0.998097 at , 0.982963 at .
Irradiance on the untilted plate from the cap alone, and the Lambert evaluation of the integral with , one bounce, no interreflect:
Lambert’s is already per steradian. The in cancels it. Dropping and leaving in place is not a harmless rescaling. The weight still has the units of radiance. The integral is the wrong one. That wrong integral is the red ghost.
Named fill is a dim constant on the rest of , same projected measure. The complement has projected solid angle :
E_analytic_* is the disk product . Lo_analytic_*_Y is disk plus fill. The A/B irradiance identity is the disk row. The two columns answer different questions.
Estimator of the same integral
Uniform in solid angle on , and cosine-weighted, are instruments of the integral above. Same , same . This note does not rank them. That ranking is the importance-sampling note.
| arm | sample on | |
|---|---|---|
| uniform- | , | |
| cosine- | , |
Under the factor cancels, and a hit contributes or according to the cap test. Under the cosine stays in the weight: . Both estimate the integral written once above, provided the density in the denominator is the density that was sampled. supplies one . supplies the other. is accounted for. A density built on pixel footprint, or on uniform , does not become a solid-angle density by writing next to it.
Small-angle stand-in
and at and , and at , are from the metrics. at and the column are that closed form, evaluated. They are not extra rows of the metrics file.
| [sr] | [sr] | [sr] | |
|---|---|---|---|
| (IS-note key) | 0.012398431 | 0.012386198 | 0.012402511 |
| (A) | 0.023909417 | 0.023863926 | 0.023924596 |
| (B) | 0.214094348 | 0.210446804 | 0.215321366 |
Each entry is close to its neighbors. The ratio of the stand-in is exactly . The identity is
tracks . E_over_omega_ratio 0.984837 is the quotient of those two printed ratios, . The absolute foreshortening at B alone is .
Fairness, gated:
Only or the cosine changes between the photographs. The disk spectrum is one RGB triple, , Rec.709 luma , exposure . The brightness change on the size plate is the lesson.
Unique artifacts
The grid plate is the measure drawn as a mesh. Twelve equal steps of from 1 to 0, twenty-four equal steps of . Every cell has solid angle
The sky cap is a spherical polygon of half-angle (cap B), laid on that mesh. It is not a lat-long texture, and it is not however many quads the checkerboard painted. The boundary cuts cells; is the cap integral. The lower caption rounds cap B to , , prints the IS-key 0.012398431, and states d omega = d phi d(cos theta). The ninth digit lives in the metrics: 0.214094348 and 0.210446804. Upper line: the measure, not a latlong unwrap.
The wedge plate is the same cap in side view, above and below. Left: the polar segment on the sphere, cone rays drawn, unprojected . Right: the foreshortened disk of radius , area on the unit sphere. At the disk is a speck and . At the disk is readable and the ratio is 0.982963. Lower caption: at 5 deg they almost agree; at 15 deg the article appears. The row labels print to nine digits and the ratio to six; quote the metrics, not a re-read of the JPEG.
| [sr] | [sr] | ||
|---|---|---|---|
| 0.023909417 | 0.023863926 | 0.998097 | |
| 0.214094348 | 0.210446804 | 0.982963 |
The identity plot plots irradiance against , out to so the axis covers . Cyan is , the disk row. Gold is that plus named fill on the projected complement,
The vertical gap is . It narrows as the cap grows. Red is the Failure-B ghost , plotted at . Its gap above cyan is . At that gap is invisible on this axis. At the metrics already carry it: . At the rung, an analytic mark on this plot and not a second metrics family,
Circles mark the ladder . Squares are the cosine- arm at , at A and at B only, mapped back by . The estimator’s reference includes fill, so the squares target gold, the total irradiance. A square on the red ghost would mean the cosine had been dropped from the weight. A square read against cyan alone ignores the fill the estimator was asked to integrate. rel_err in the metrics is how far the underlying sits from Lo_analytic, not a pixel reading of this JPEG.
These three plates are the fingerprints. The courtyard stills do not replace them.
Size A/B
The size plate is the photograph of Failure A. Identical , identical , identical , identical camera. The two RGB triples compare equal.
From the metrics, disk cap, untilted card:
| A | B | B/A | |
|---|---|---|---|
| [sr] | 0.023909417 | 0.214094348 | 8.954394 |
| [sr] | 0.023863926 | 0.210446804 | 8.818616 |
| (disk, ) | 0.313739973 | 2.766752422 | 8.818616 |
| — | — | 9.000000 (rejected) |
The same- pair under Failure A is the area hook: , , , ratio 3.536.
The stored footprints are 910 and 7242, and they are not a ratio to set beside 8.954394 or 8.818616. Failure C: different frames, both tagged illegal as steradians. The lower caption of the size plate already prints the irradiance ratio.
Fill is named: Li_fill , , disk/fill -ratio 200. At that dim hemisphere is the same order as the disk term inside Lo_analytic_A_Y 0.132081911, because is small. At the disk dominates: E_analytic_B 2.766752422, Lo_analytic_B_Y 0.753613234. The ratio 8.818616 is the disk-cap identity. Interreflect is not in it. Walls exist so the courtyard reads.
Cosine tilt, then the ladder
The cosine plate moves and leaves the disk alone. fixed in world. , exposure, and frozen. Left , , . Right . Small-source caption: . The analytic row is the cap integral
Half of is . The cap stays above the horizon (), and the two numbers meet inside the gated tolerance . The caption is 0.5. The meter is the integral 0.105223414. The Monte Carlo ladder below is the untilted card. Do not “fix” the dark card by raising .
The MC- plate estimates the rendering equation at the card center, , . Two arms, one stream per sample index, nested prefixes: is the head of , which is the head of , which is the head of . The published value is a mean over a small card-center neighborhood of independent streams. Reference is Lo_analytic_B (disk + fill), . rel_err is on that mean. It is not a single-pixel lottery and not the importance-sampling note’s .
From the metrics ( ladder):
| unif | unif rel_err |
cos | cos rel_err |
|
|---|---|---|---|---|
| 16 | 0.638092875 | 0.153288654 | 0.625904322 | 0.169462141 |
| 64 | 0.766444683 | 0.017026571 | 0.740971565 | 0.016774743 |
| 256 | 0.770062149 | 0.021826733 | 0.771251976 | 0.023405564 |
| 1024 | 0.758612514 | 0.006633748 | 0.761155903 | 0.010008675 |
The thumbnails label the cosine arm at display rounding (0.1695, 0.0168, 0.0234, 0.0100). Those four decimals are not the quote. The metrics are.
bumps against on both arms (unif ; cos ). The rise is on the MC plate, between the second and third markers, on both traces. One seed, nested prefixes, not a theorem that every rung is monotone. The gate is the nested fall to 1024: rel_err at is below and below on both arms. Which arm sits closer changes with the rung. That trade is not a sampler ranking. A flat error out to 1024 would be a broken weight or a broken .
Uniform- at is a high-variance instrument. The cap is a small fraction of . Card-center A at , from the metrics: unif rel_err 0.054307110, cos 0.059173158. The fall gate uses the ladder.
Quote the metrics. Do not quote the beauty photographs as meters.
Float buffer, Mesa llvmpipe. , , , , rel_err from linear Rec.709, before Neutral. Seed 1352782172. Hash = pcg. TM = Khronos PBR Neutral (not re-fit), .
| item | value |
|---|---|
| / | 5.000° / 15.000° |
| / | 0.023909417 / 0.214094348 sr |
| / | 0.023863926 / 0.210446804 sr |
| 8.954394 | |
| / (disk) | 0.313739973 / 2.766752422 |
| 8.818616 | |
E_over_omega_ratio |
0.984837 |
naive_alpha_sq_ratio |
9.000000 (rejected) |
| same- / | 0.663334 / 0.187600 sr |
| same- ratio | 3.536 |
| hemisphere / sphere | 6.283185307 / 12.566370614 sr |
| RGB A and B | (12.0, 13.2, 16.0) bit-identical |
| 13.147 | |
| RGB / | (0.0600, 0.0660, 0.0800) / 0.065735 |
| disk/fill ratio | 200.000 |
| exposure / / | 1.00 / 0.80 / |
Lo_analytic_A_Y / Lo_analytic_B_Y |
0.132081911 / 0.753613234 (disk + fill) |
| / | 0.105223414 / 0.500 |
pixels_disk_A / pixels_disk_B |
910 / 7242 (omega_from_pixels_illegal) |
| IS-key | 0.012398431 sr (header; cited) |
| seed / hash | 1352782172 / pcg |
The Monte Carlo ladder is the table in the previous section. Card-center A at is only in the metrics: unif 0.139254898, cos 0.139897615, rel_err 0.054307110 / 0.059173158.
Hero line: 8.818616; same- 3.536; IS-key 0.012398431; 13.147; fill -ratio 200; seed 1352782172; 28 pass / 0 fail. Do not invent or from the hero, the size plate, or the cosine plate. The metrics strip is a snapshot of this table. The source of quoted numbers is the float-buffer metrics.
Controls
Three knobs. Everything else stays put.
Size ()
Locked A/B: , on-axis from the card center, one disk radiance. Ladder rungs on the identity plot only: , , . Same- area control is a caption on the size plate and a row in the metrics, not a reshoot.
Cosine ()
Locked: disk fixed in world, card normal at . The analytic row is the cap integral, written next to .
MC-
Locked ladder at the untilted card center. Uniform- and cosine-, same , nested prefixes. Hero quote is the fall to 1024. may sit above .
Frozen on every plate:
- Camera, card albedo, wall and floor albedo, fill radiance, disk RGB, exposure , Neutral constants inherited from the tone-mapping note, one seed.
- Display: RGBA32F Neutral sRGB OETF on CPU.
GL_FRAMEBUFFER_SRGBoff. - No auto-exposure. No per-plate gain.
- Fill named. Disk / fill luminance ratio 200.
- from the cap formula. The white shape in the opening is a drawn disk. Triangle count does not define the steradian.
The fairness gate is bit-identical on A and B. Only or changes. Darkening A by lowering so the JPEGs read as a pair fails the note.
Two paths, do not mix the instruments
| path | frames | what it is |
|---|---|---|
| Photograph | 00, 01, 02 |
GLSL 330 courtyard on this llvmpipe. Disk form factor in the shader. Neutral , sRGB OETF. |
| Instrument | 03, 04, 05, 06, 07, metrics |
Equal- grid, – plot, projected wedge, nested MC rel_err, closed forms. |
| Display | every plate | Neutral sRGB OETF. Resolve is linear. The operator is inherited. |
The size plate is a photograph of the control and the source of the teaching. The number 8.818616 is the metrics.
Honesty gaps
- Beauty shading, including the card, is a disk form factor in GLSL. The meter is the card-center analytic identity and the CPU estimator. The JPEG is a picture of the courtyard.
- Fill -ratio is 200. At the fill term is the same order as the disk term inside
Lo_analytic_A_Y0.132081911. At the disk dominatesLo_analytic_B_Y0.753613234. The ratio 8.818616 is disk-only. - Tilt. . Half of is . They meet inside . The caption is . The cap stays above the horizon. The ladder is untilted.
- Interreflect is not in the A/B identity. Walls exist so the courtyard reads.
pixels_diskis a luma threshold on the linear frame, before Neutral, aimed at the drawn disk. 910 is the , panel. 7242 is the hero. Not a matched pair. Not a steradian. A cap is 0.023909417 sr either way.- Uniform- at is high variance. The fall gate is the nested ladder.
- bumps versus on both arms. The traces on the MC plate show it. The gate is nested fall to 1024, both arms, below and below .
rel_erris a nested neighborhood mean, not a single pixel and not . Thumbnails show the cosine arm. The metrics hold both arms. HUD rounding on the thumbnails is not the quote.- JPEG is 8-bit display-referred. Neutral + OETF allocates codes. , , , and
rel_errlive in the float buffer and in the metrics. - Neutral constants are copied from the tone-mapping note. Not re-fit. Energy after Neutral is not a claim.
- Analytic disk. Not a captured EXR. Not a directional delta, which would replace the cap with a Dirac and erase the steradian plate. The drawn opening does not define by tessellation.
- The two MC arms are instruments of one integral. Closer
rel_errchanges with . Cite the importance-sampling note for pdf–integrand mismatch. Cite the IBL note for Karis / DFG. Env mean luma 1.628 stays there. - A irradiance jump at versus is the rejected stand-in. The identity is 8.818616. A same- ratio of 4 is the rejected inverse-square in distance. The identity is 3.536.
Mesa / llvmpipe — what this run can claim
| item | value |
|---|---|
GL_VERSION |
4.5 (Core Profile) Mesa 25.0.7-2+deb13u1 |
GL_RENDERER |
llvmpipe (LLVM 19.1.7, 256 bits) |
| OSMesa | core 3.3 request; driver reports 4.5 core |
| FBO color | RGBA32F complete, . 8-bit fallback not hit |
GL_FRAMEBUFFER_SRGB |
disabled (Neutral + sRGB OETF on CPU) |
| MSAA | disabled |
| RNG | PCG hash, seed 1352782172 (0x50A1D15C) |
| Neutral | 1.00 |
| disk / fill | analytic cap + named dim hemisphere, -ratio 200 |
| estimator | uniform- | cosine- | analytic-cap |
Can claim: on this OSMesa / llvmpipe build, an analytic sky cap of published over a Lambert card, same , produces an irradiance and a one-bounce that track . The hemisphere grid, the – plot, and the projected wedge are diagrams of that identity. A fixed- estimator of the rendering equation at the card center reports the numbers in the metrics.
Cannot claim: hardware RT, a real-time budget, or interactive 1-spp. That uniform or cosine is the production sampler. Energy after Neutral. Anything measured off the JPEG. A captured sky. Interreflect inside the A/B ratio. A pixel footprint as a steradian. A irradiance jump at versus as confirmation. A same- ratio of 4 as confirmation.
Assertions
This run: 28 pass / 0 fail.
| check | result |
|---|---|
| FBO is RGBA32F | PASS |
| , | PASS |
| , | PASS |
| PASS | |
| , and outside | PASS |
| naive , labeled | PASS |
| same- ratio , and outside | PASS |
| ; disk/fill | PASS 200 |
| RGB bit-identical A/B | PASS |
MC : rel_err at below and below , both arms |
PASS |
| within of | PASS 0.105223414 |
| hero, size, grid, vs , wedge, metrics plates | PASS |
pixels_disk_B>20, pixels_disk_A>0 |
PASS 7242 / 910 |
No tolerance was opened to accept or a same- ratio of 4.
Out of scope
Phong-versus-cosine as a second bake-off, MIS balance heuristics, GGX VNDF, Smith , the half-vector Jacobian. Cite the importance-sampling note for pdf–integrand mismatch. Split-sum, Karis prefilter, DFG LUT, the loft HDR — cite the IBL note. Tone-map bake-off — Neutral is inherited at ; cite the tone-mapping note. A full path tracer: multi-bounce GI, next-event estimation as a sampling arm, Russian roulette, spectral transport, participating media. Real-time path tracing, hardware RT, DLSS / SVGF / OIDN / ReSTIR. Area-light LTC as the production method — the wedge is a diagram of against . A directional delta, IES profiles, Hosek–Wilkie / Preetham as the disk. Microfacet metals and the banned still-life (lacquer, brass, oak, bottle glaze). Shadow maps, POM, anisotropic footprints, mip LOD, TAA. Different notes.
Measure lock
Omega(alpha) = 2 pi (1 - cos alpha)
Omega_perp(alpha) = pi sin^2(alpha)
E_disk = Li_Y * Omega_perp
Lo_disk = rho * Li * sin^2(alpha)
Lo_analytic = Lo_disk + rho * L_fill * (1 - sin^2(alpha))
E_B / E_A = 8.818616 # (15/5)^2 = 9 is the rejected stand-in
sameR Omega ratio = 3.536 # R=1, d=2/4, area=pi; 4 is rejected
IS-key 3.600 deg -> Omega = 0.012398431 sr # cited, not rematched
hat Lo = (1/N) sum f_r Li (n·w) / p(w)
p_unif = 1/(2 pi) on Omega^+ # cos theta = xi_1
p_cos = (n·w) / pi # cos theta = sqrt(xi_1)
PNG = sRGB_OETF( Neutral(e * Lo) ) # e=1.00, inherited
Pin the hero as the presentation. Pin the size A/B plate as the teaching pair. Pin the grid, vs , and wedge as the fingerprints. Pin the MC- plate as the estimator. Path tracers sample . Irradiance tracks . The previous note’s densities were already in . This note drew the steradian.