Imagination pass 3c: the true cavity. Unbounded fill carved by one pseudo-Gaussian sphere, the camera re-derived inside the hollow, (e) honestly under 2x, Q8 cavity-contract

Ruling operator-void-true-cavity: the void is a 3D hollow in a cloud volume,
not the 2021 bowl. The outer volume is an unbounded fill so every ray ends in
a wall; Rc grows to 640 so the hollow (198) holds the camera at 186. With no
sky the evaluation ratio for the shipped scene is predicted 1.0-1.2x; the
pre-pass's gain there is sample placement (2.0-2.6x), raised as Q8.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Meta Vens 2026-10-02 23:22:36 +02:00
commit 210a4f50cd
3 changed files with 93 additions and 54 deletions

View file

@ -20,9 +20,9 @@
"(Review, continued.) (4) The dense sample evaluated the detail octave even where occupancy was 0; r2's dense sample evaluates coverage first and the detail only when the envelope and coverage leave density > 0, as Aetheria's `if (dist < _SafetyDistance)` does; the dense baseline gets cheaper and the comparison honest. (5) The finest-level probe before integrating a cell stays: amortized over the tile it costs 1/N^2 and can skip 3 snoise per ray. (6) The step never regrew after a dense cell until a skip; with (3) it regrows from the next skip, which is enough.",
"The march, on cell ranges. The dense grid is a scenario-owned list of cell boundaries z_0 < ... < z_J (uniform for the slab scenarios; Aetheria's quadratic spacing z_j = near + (j/J)^2 (far - near), J = 256, for the Aetheria-like ones, from CloudShader.shader:116). MarchTile takes a range [j0, j1): the envelope probe over the slice (z_j0, z_j1); if empty, skip and double the next range; else if the noise probe is affordable (item 2) and proves empty, skip; else if the range is more than one cell, halve; else the cell is dense. It runs to the grid's end once per tile (a pre-pass does not know any ray's transmittance) and yields the dense cells; each of the N^2 rays integrates exactly those cells in order with the dense march's own Integrate and early-out at 0.02. Counted separately: snoise evaluations and envelope evaluations (pointwise in the dense march; interval probes in the tile march), per ray with probes divided by N^2.",
"The cost model, printed and reasoned about in snoise units: a pointwise envelope evaluation or an envelope probe costs e = 0.2 (a handful of pulses or a height-map fetch against ~150 flops of snoise; stated as an estimate, both counts printed so any weight can be applied). Per scenario the test prints: dense snoise and envelope per ray, tile snoise and envelope probes per ray, the combined cost ratio, and the probe-free ceiling (dense cost over the cost of the dense cells alone). The 2x contract is on the combined cost at N = 8 for scenarios (a) and (c); (b) and (d) are printed as the worst cases and not asserted.",
"Scenarios (IV-REPORT lines, each with 64 tiles at N in {1, 4, 8, 16}, warp in {0, D}): (a) height fog: h = 0, camera at y = S + 30, rays with slope m_y in [0, 0.5] (level and up), Aetheria's grid, expected near-total skip (0 snoise either way; the envelope count carries the ratio). (b) inside the fog: h = 0, camera at y = F - 10, rays level, expected near 1x: every ray saturates within a few cells and the pre-pass still probes the whole grid. (c) Aetheria-like: the zone bowl R = 2000 and four wells of mass {100, 1000, 10000, 1000} at seeded positions inside R, camera at a seeded xz in the bowl at y = max(0, S + 10 - h(camera)), rays gazing across with m_y in [-0.25, 0.1], Aetheria's units (noise scale 414 so F0 = 1/414, D = 15 * 8 / 2 = 60, A = 20 with snoise in [-1, 1]), Aetheria's grid. (d) the uniform slab: r1's field and parameters, kept as the reported worst case. The headline is (e) at N = 8, 200 tiles; (c) is asserted too.",
"(e) the void, the shipped scene (ruling operator-ground-void-brush; the original's units from Aetheria e6181c11, see the site-ground r3 spec): h(xz) = 75 + 40 (1 - (r / 256)^2)^16 for r = |xz - sun.xz| < 256 (the pseudo-Gaussian brush, half depth at r = 52), floor offset F = -16.46, floor blend 39.6, S = 50, A = 20, F0 = 0.01, D = 10; the fog top is at y = -91 outside the void and -131 at the sun. Camera inside the bowl at sun + (150 along the tangent, 25 up) = y -105, looking at the orbit centre at the sun's depth, rays over the whole frustum (vertical FOV 60, f = 935): up into clear sky, level into the walls, down toward the sun. Uniform grid, StepDense 10, 96 cells to 960. Expected: sky tiles retire the slab in a few envelope probes, wall and floor tiles hand over to dense cells where opacity terminates in a few.",
"Predictions to confirm or refute, N = 8, combined cost: (a) above 50x (dense pays 256 envelope evaluations per ray, the tile about ten probes shared by 64 rays). (b) 0.8-1.0x. (c) 2-4x: clear cells collapse to a few probes per tile, fog cells cost the same on both sides; the noise ball proves nothing at Aetheria's scale (L r F0 >= 1.6 at the finest cell with D = 60), so item 2 keeps it from being evaluated and the saving is the envelope's. (e) 2-3x on the whole frustum: sky rays go from 96 envelope evaluations to a few probes per tile, wall rays cost about the same on both sides, and the mix decides; the noise ball proves nothing here either (L r F0 >= 1.5 at the finest cell with D = 10). (d) 1.3-1.5x: the ceiling at L = 10.099261 with the cheaper dense baseline. If (a), (c) or (e) misses 2x, skip the assertion the way r1 did, naming a new question saving-2x-scenarios with the printed numbers; do not tune the fields, the grids or e.",
"Scenarios (IV-REPORT lines, each with 64 tiles at N in {1, 4, 8, 16}, warp in {0, D}): (a) height fog: h = 0, camera at y = S + 30, rays with slope m_y in [0, 0.5] (level and up), Aetheria's grid, expected near-total skip (0 snoise either way; the envelope count carries the ratio). (b) inside the fog: h = 0, camera at y = F - 10, rays level, expected near 1x: every ray saturates within a few cells and the pre-pass still probes the whole grid. (c) Aetheria-like: the zone bowl R = 2000 and four wells of mass {100, 1000, 10000, 1000} at seeded positions inside R, camera at a seeded xz in the bowl at y = max(0, S + 10 - h(camera)), rays gazing across with m_y in [-0.25, 0.1], Aetheria's units (noise scale 414 so F0 = 1/414, D = 15 * 8 / 2 = 60, A = 20 with snoise in [-1, 1]), Aetheria's grid. (d) the uniform slab: r1's field and parameters, kept as the reported worst case. The headline is (e) at N = 8, 200 tiles, printed with both its numbers; (a) and (c) are asserted.",
"(e) the void, the shipped scene (rulings operator-ground-void-brush and operator-void-true-cavity; site-ground r3): a cloud volume everywhere, carved by one negative pseudo-Gaussian sphere. d = |p - c_v|; g(d) = (1 - (d / Rc)^2)^4 for d < Rc, else 0; Rc = 640, CARVE = 1.5, so density = K max(0, 1 - CARVE g(d')) is exactly 0 inside the hollow radius Rh = Rc sqrt(1 - CARVE^(-1/4)) = 198 and ramps to full by Rc. Noise only near the wall: fade(d) = smoothstep(Rh - S, Rh, d), S = 50; d' = d + A fade(d) n(warp(p)), A = 20, F0 = 0.01, D = 10; K = 1/30 (optical depth 1 per 30 units of full density). The sun sits at the bottom of the hollow (y = c_v.y - Rh + 12.5); the camera is 120 behind it along the orbit tangent and 45 above it, 186 from c_v: inside the hollow, low. Rays over the whole frustum (vertical FOV 60, f = 935): every ray crosses empty interior (14 to 380 units) and ends in a wall. Uniform grid, StepDense 10, 128 cells to 1280 = 2 Rc; termination by transmittance < 0.02.",
"Predictions to confirm or refute, N = 8, combined cost: (a) above 50x. (b) 0.8-1.0x. (c) 2-4x: clear cells collapse to a few probes per tile, fog cells cost the same on both sides; the noise ball proves nothing at Aetheria's scale (L r F0 >= 1.6), so item 2 keeps it unevaluated and the saving is the envelope's. (d) 1.3-1.5x: the ceiling at L = 10.099261. (e) 1.0-1.2x, under 2x, said plainly: with no sky every ray ends in a wall, the hollow costs the dense march only envelope evaluations (about 20 x 0.2 per ray against about 15 wall cells x 3.2), and the pre-pass can only remove those. What it buys there is sample placement: at the site's S the samples land in the 150-unit wall ramp, not the whole ray; the test prints marched length over wall length per ray (predicted 2.0-2.6x). (e) asserts per the fork cavity-contract and skips naming it until ruled. If (a) or (c) misses 2x, skip naming saving-2x-scenarios. Never tune the fields, the grids or e.",
"Stryker on Yggdrasil from a plain clone: --since:c9bd003b -m math.Interval.cs; report timeouts separately from kills (a timeout is not a demonstrated kill); if the saving test is what times mutants out, exclude it from Stryker's test selection (a measurement, not a pin) rather than raising the timeout. Compile checks on Starfire, one job, detached with a log, polled in the foreground: FXC cs_5_0 over every cultmath_iv_* including the new function, both tracked copies; then tools/get-dxc.ps1 (pinned, ruling operator-compiler-downloads) and dxc -T lib_6_3 -HV 2021 on both copies. Carried from r1 and still out of scope, name them in the report: the Unity CultMath.dll is not rebuilt; the Unity HLSL copies stay one blob with packages/cultmath/shaders; public asfloat(uint) stays. Branch from c9bd003b; if main moved by docs only, say so as r1 did."
],
"deletes": [
@ -88,7 +88,7 @@
"path": "packages/cultmath/tests/CultMath.Tests/NoiseBoundTests.cs",
"line": 409
},
"change": "IntervalSkipHalvesEvaluations: scenarios (a)-(e) x N in {1, 4, 8, 16} x warp in {0, D}, 64 tiles each; headline (e) at N 8, 200 tiles; assert >= 2x combined cost for (a), (c) and (e) at N = 8, else Skip naming saving-2x-scenarios."
"change": "IntervalSkipHalvesEvaluations: scenarios (a)-(e) x N in {1, 4, 8, 16} x warp in {0, D}, 64 tiles each; headline (e) at N 8, 200 tiles; assert >= 2x combined cost for (a) and (c) at N = 8; (e) per the cavity-contract ruling, else Skip naming it."
},
{
"location": {
@ -159,7 +159,7 @@
},
{
"name": "NoiseBoundTests.IntervalSkipHalvesEvaluations",
"pins": "scenarios (a), (c) and (e) at N = 8 cost at most half the dense combined cost with transmittance within 1e-3; prints every scenario, N and warp with both counts and the ceiling; a shortfall skips naming saving-2x-scenarios."
"pins": "scenarios (a) and (c) at N = 8 cost at most half the dense combined cost with transmittance within 1e-3; (e) prints its cost ratio and its placement ratio and asserts per the cavity-contract ruling; every scenario, N and warp printed with both counts and the ceiling."
},
{
"name": "IntervalTests.EveryOpEnclosesItsPoints (existing)",
@ -185,7 +185,7 @@
},
{
"pattern": "Assert\\.Skip",
"scope": "NoiseBoundTests.cs: at most one, in IntervalSkipHalvesEvaluations, naming saving-2x-scenarios; 0 if (a), (c) and (e) meet 2x."
"scope": "NoiseBoundTests.cs: at most two, in IntervalSkipHalvesEvaluations, naming saving-2x-scenarios and cavity-contract; 0 once both are met or ruled."
},
{
"pattern": "10\\.099261|0\\.35f",
@ -211,8 +211,11 @@
"rulings": [
"cultmath-tapes:ruling:operator-tile-amortized-march",
"cultmath-tapes:ruling:operator-ground-void-brush",
"cultmath-tapes:ruling:operator-void-true-cavity",
"cultmath-tapes:ruling:operator-compiler-downloads",
"cultmath-tapes:ruling:operator-campaign-home"
],
"questions": []
"questions": [
"cavity-contract (map, Q8): which number the shipped cavity scene promises"
]
}

View file

@ -2,7 +2,7 @@
"campaign": "cultmath-tapes",
"cut": "site-ground",
"revision": 3,
"title": "Site ground r3: the void. A pseudo-Gaussian brush carves a bowl in a cloud floor, a sun at its bottom lights the cavity and orbits, the camera follows low; tile pre-pass, camera-aware TAA",
"title": "Site ground r3: A cloud volume carved by one negative pseudo-Gaussian sphere, a sun at the hollow's bottom lights the walls and orbits, the camera follows low inside; pre-pass, camera-aware TAA",
"repo": "GameCult/gamecult-site",
"branch": "main",
"base": "535d170",
@ -15,15 +15,16 @@
"Map: F:/Projects/CultLib/docs/cultmath-interval-ground-cut.md, 'Pass 3' (the void scene, the composed bound, the pre-pass, the budget), then 'The shader design' for what pass 3 does not restate (sampled wash, palette input, pausing, contrast). Rulings in force: cultmath-tapes:ruling:operator-ground-void-brush (the scene), operator-tile-amortized-march (the march), site-masthead:ruling:operator-chromeless-column; wash-home-only's authority map. Re-pin base to main after wash-home-only lands. Stardust and DoF stay the next cut; leave the named composite slot. r2's token, readback, controller, vendoring, parity and fallback items stand unless this revision names them.",
"The original, read once (Aetheria at e6181c11, 2021-03-13, Assets/Scenes/Main Menu.unity; Prefabs/RPG/Planets/Sun.prefab; Materials/Brushes/Gravity Well.mat, Main Menu Sun Fog Tint.mat, Main Menu Ambient Fog Tint.mat, Sector Boundary Fog.mat; Materials/Fog Marching Main Menu.mat; Shaders/Raymarching/VolumeRender.shader at that commit; Shaders/Brushes/PowerBrush.shader). What survives, in the original's units: the brush is PowerBrush (1 - x^2)^16 with depth 40 over radius 256 (half depth at r = 52, pseudo-Gaussian sigma about 45), the sun's own gravity-well child; a wide boundary bowl (depth 75, power 0.25, radius 1500) is flat across the scene and acts as a constant 75; floor offset -16.46, floor blend 39.6, so the fog top is at y = -91 outside the void and dips to -131 at the sun; the sun sphere (radius 12.5) sits at y = -130, the bottom of the void.",
"What survives (continued): the sun is a child of 'Center', which rotates 5 degrees per second about y (72 s period), at orbit radius 175; the camera is a Cinemachine vcam following the sun (framing transposer, distance 150, damping 10, handheld noise amplitude 1 at frequency 0.25) and looking at 'Look Target' (0, -130, 0), the orbit centre at the sun's depth; the saved camera sits at y = -27, 64 above the fog top. The lighting was authored, not marched: the sun's 'Fog Tint' brush (1 - x^2)^3, depth 2, radius 128, colour (1, 0.4, 0.1) orange, painted into the tint map, times a scene-wide ambient tint (0.18, 0.59, 1) blue, depth 0.01. Stardust: 256^2 particles, spacing 2, floor -60, ceiling 0, height exponent 800 / (ceiling + wellDepth) so particles climb higher where the well is deeper (the void fills with stardust). Noise: strength 150, frequency 0.01, safety 50. Not surviving: the 2021 d() details, the tint map's runtime contents, the video.",
"The field, in the original's units (world units; the camera is near the sun, so float32 is fine): well map h(xz) = H0 + Dw (1 - (r / Rw)^2)^16 for r = |xz - sun.xz| < Rw, else H0; H0 = 75, Dw = 40, Rw = 256. Pre-distortion SDF s(p) = p.y + h(p.xz) - F with F = -16.46, so the fog surface is s = 0: y = -91 outside, -131 at the sun. fade(s) = 1 - smoothstep(0.75 S, S, s), S = 50. s' = s + A fade(s) n(warp(p)), n the two-phase warped coverage noise plus half the detail octave at F0 = 0.01, A = 20 (authored; the original's 150 is too violent for a 40-deep bowl). density = max(0, -s' / B) K, B = 39.6, K the extinction. Clear space is s' >= 0, and above s >= S no noise is evaluated. The brush is radial in xz and carves a bowl in a cloud floor, as the original did (Q7 a); a true 3D spherical cavity is Q7 b.",
"Scene motion. The sun orbits the origin at radius 175 in xz with period 72 s at depth y = -130; the void (h) is centred on the sun and moves with it. The camera follows the sun at horizontal distance 150 along the orbit's tangent behind it, at y = sun.y + 25 = -105 (inside the bowl: 14 below the rim at -91), looking at the orbit centre at the sun's depth (0, -130, 0), with a slow handheld drift (two low-frequency snoise on time, amplitude 2 units). Camera, sun and void positions are one function of time in ground.js (worldAt(t)), uploaded as uniforms; the shaders never integrate motion.",
"The field (ruling operator-void-true-cavity: a spherical hollow inside a cloud volume that surrounds it on every side, not the 2021 bowl). Units are the original's. Outer volume: an unbounded uniform fill, chosen over a shell because every ray then ends in a wall and the march terminates by opacity, never by a far plane; the far plane Z1 = 2 Rc bounds the pre-pass range only. The carve: d = |p - c_v|, g(d) = (1 - (d / Rc)^2)^4 for d < Rc, else 0 (the pseudo-Gaussian, exponent 4 so the wall is a ramp and not a skin), Rc = 640, CARVE = 1.5. density = K max(0, 1 - CARVE g(d')): exactly 0 inside the hollow radius Rh = Rc sqrt(1 - CARVE^(-1/4)) = 198, half at d = 0.49 Rc, full at Rc. Noise displaces the wall only: fade(d) = smoothstep(Rh - S, Rh, d), S = 50; d' = d + A fade(d) n(warp(p)), A = 20, F0 = 0.01. K = 1/30 with the extinction, so a wall is opaque within about 150 units of entry. Rc grew from the brush's 256 because a 3D hollow must hold the camera (next item).",
"Scene motion. The sun orbits the origin at radius 175 in xz with period 72 s (5 degrees per second, the original's Center pivot). The cavity centre is c_v = sun + (0, Rh - 12.5, 0): the sun sphere (radius 12.5) rests on the hollow's bottom and the hollow moves with it. The camera follows the sun 120 behind it along the orbit's tangent and 45 above it, so it sits 186 from c_v, 12 inside the hollow (the handheld drift is 2 units, two low-frequency snoise on time), low in the cavity, looking at the sun's position plus (0, 60, 0) so the lit lower wall and the dark upper wall share the frame. The 2021 follow distance 150 and height 25 do not fit a hollow a camera can stand in; 120 and 45 are the re-derivation, and the report says so. worldAt(t) in ground.js is the one owner of sun, cavity and camera, uploaded as uniforms; the shaders never integrate motion.",
"The flow field, authored around the void: flow(xz) = SWIRL * tangent(xz - sun.xz) * (1 - (r / Rw)^2)^2 + GLOBAL * (snoise(xz Ff + o1), snoise(xz Ff + o2)) (the swirl is largest mid-slope and zero at the rim and the centre; the global term is r2's). The flow texture is a world-space window of side 4 Rw centred on the sun, quarter of the canvas resolution, re-rendered every frame; warp, hue, motion vectors and (next cut) the stardust read it, so D4 holds with a moving scene. D = FLOW_MAX * PERIOD / 2 as before, with FLOW_MAX the authored maximum of the swirl plus the global amplitude.",
"The march (tile pre-pass, interval-ops r2's design). Pre-pass at W/8 x H/8: per tile, the loop over the slab's cell ranges (uniform cells, StepDense = 10, 96 cells to a far plane of 960 along +view depth): the envelope probe first (exact box: y and xz ranges by cultmath_iv_mul of the depth and slope intervals, h's interval from the box's least and greatest distance to the sun's xz, monotone), then the noise ball (cultmath_iv_frustum_ball with D, cultmath_iv_snoise_ball) only when fade.hi > 0 and L r F0 leaves room to prove anything; writes the 96-bit mask of cells not proven empty to an RGBA32UI texel. Main pass: texelFetch the mask, place S samples stratified over the unmasked cells only (exact: masked cells are zero), integrate transmittance and the depth-weighted mean distance, and apply the light below. With the camera inside the void, sky tiles retire the whole slab in a few envelope probes; wall and floor tiles mark the cells at the wall.",
"Lighting, the cheapest version that keeps it moody (the original's own mechanism, made 3D): at each sample, light = SUN_COLOUR * (1 - (d / Rl)^2)^3 for d = |p - sun| < Rl, Rl = 128, plus AMBIENT * ambientTint; colour = density * (light + ambient) * hue(flow). No light march: zero extra snoise, one length and one pow per sample. The far cavity stays dark because the pulse is zero beyond Rl; the walls brighten by proximity to the sun; the sun itself is a small additive disc drawn in the resolve at its projected position, occluded by the accumulated transmittance along its ray. Not in this cut, measured before it is ever added: one envelope-only transmittance sample toward the sun per primary sample (self-shadowing by the bowl's geometry), about +25% march cost; it is desktop-only if ever.",
"The march (tile pre-pass, interval-ops r2's design). Pre-pass at W/8 x H/8: per tile, the loop over the slab's cell ranges (uniform cells, StepDense = 10, 128 cells to Z1 = 1280 = 2 Rc along +view depth): the envelope probe first (exact box: y and xz ranges by cultmath_iv_mul of the depth and slope intervals, d's interval is the box's least and greatest distance to c_v, exact; g, fade and the carve are monotone in it), then the noise ball (cultmath_iv_frustum_ball with D, cultmath_iv_snoise_ball) only when fade.hi > 0 and L r F0 leaves room to prove anything; writes the 96-bit mask of cells not proven empty to an RGBA32UI texel.",
"(March, continued.) Main pass: texelFetch the mask, place S samples stratified over the unmasked cells only (exact: masked cells are zero), integrate transmittance and the depth-weighted mean distance, and apply the light below. Every tile's interior cells retire in a few envelope probes and its wall cells are marked; there are no sky tiles. Behind a fully transmissive pixel the resolve shows --gamecult-nebula-base; by construction only an unfinished ray (budget exhausted before the wall, measured, must be under 1%) reaches it.",
"Lighting, the cheapest version that keeps it moody (the original's own mechanism, made 3D): at each sample, light = SUN_COLOUR * (1 - (d / Rl)^2)^3 for d = |p - sun| < Rl, Rl = Rh = 198 (the original's 128 scaled with the hollow), plus AMBIENT * ambientTint; colour = density * (light + ambient) * hue(flow). No light march: zero extra snoise, one length and one pow per sample. The lower wall within Rl of the sun glows and the upper wall stays dark because the pulse is zero beyond Rl, which is the moody split; the sun inside the hollow is occluded by nothing, so the sun itself is a small additive disc drawn in the resolve at its projected position, occluded by the accumulated transmittance along its ray. Not in this cut, measured before it is ever added: one envelope-only transmittance sample toward the sun per primary sample (self-shadowing by the bowl's geometry), about +25% march cost; it is desktop-only if ever.",
"TAA with a moving camera. ground.js uploads this frame's and the previous frame's view-projection. For each pixel the resolve reconstructs the world point at the march's depth-weighted mean distance (written by the main pass into a second history channel, R16F), moves it back by the field motion (p + flow(p) * dt: the pattern moves at -flow), projects it with the previous VP and fetches history at that uv. The same 3x3 min/max clamp, alpha = max(1/frames, 1/32), out-of-bounds alpha 1; history reset on resize, first frame and budget step. Transmittance, colour and the depth channel are all reprojected by the one motion vector. ?ground=debug-mv shows |mv| with the camera moving and the flow frozen, and with the flow moving and the camera frozen, so both terms are seen separately.",
"Stardust distribution and the sun disc are the next cut (site-stardust), authored to the void: particles spawned in the bowl's volume with the original's height rule (more headroom where the well is deeper), lit by the same pulse, moving with the swirl. This cut leaves the composite slot and the depth history they need.",
"Fit with the tokens. Inputs: --gamecult-nebula-0 (orange 255 138 42) is SUN_COLOUR; --gamecult-nebula-2 (sky 89 183 255) is the ambient tint; --gamecult-nebula-1 (violet 109 96 255) is the cloud hue's second pole; --gamecult-nebula-base the sky. Outputs from the 8x8 readback as r2, with one change: --gamecult-light-0-at is written from the sun's projected screen position (quantised to 1%, at most 2 Hz), so the CSS wash's main light follows the sun while the shader runs; --gamecult-light-0 and -a come from the texel there; lights 1 and 2 keep their seed positions and sample their colours. When the canvas is absent the seeds paint a still of the same composition (the seed light-0-at is the sun's mean screen position).",
"Prove in the browser pane, in addition to r2's list: with ?ground=debug the pre-pass's mean probes per tile and the fraction of cells masked, and the mean snoise per pixel against a dense-reference frame (?ground=dense: no pre-pass, S samples over the whole slab; the two frames' mean luminance agree within 1/255); the camera reprojection test above; the orbit (after 36 s the sun's screen position has moved half an orbit and the TAA shows no smear at the walls); the contrast clamp with the lit cavity (max luminance <= 0.035 still holds; the sun disc is exempt only inside its own radius, which the clamp test masks and reports)."
"Prove in the browser pane, in addition to r2's list: with ?ground=debug the pre-pass's mean probes per tile and the fraction of cells masked, and the mean snoise per pixel and the fraction of samples placed in the wall ramp against a dense-reference frame (?ground=dense: no pre-pass, S samples over the whole slab; the two converged frames' mean luminance agree within 1/255; the masked frame's per-frame variance at the walls is lower, printed); the camera reprojection test above; the orbit (after 36 s the sun's screen position has moved half an orbit and the TAA shows no smear at the walls); the contrast clamp with the lit cavity (max luminance <= 0.035 still holds; the sun disc is exempt only inside its own radius, which the clamp test masks and reports)."
],
"deletes": [
{
@ -205,7 +206,7 @@
}
],
"operator": [
"open / on the desktop and on the phone; say whether the void, the sun's orbit and the camera's height read as the old main menu (uniforms: A, SWIRL, Rl, the camera offset)",
"open / on the desktop and on the phone; say whether the hollow, the sun's orbit and the camera's height read as the old main menu's mood (uniforms: A, SWIRL, Rl, CARVE, the camera offset)",
"on the phone with ?ground=debug, read the logged GPU ms per pass and the controller's final S/dpr; say whether it got warm after five minutes",
"say whether the analytic light is moody enough or the self-shadowing sample (desktop only) should be tried",
"navigate / -> /Blog -> back; say whether the ground is continuous (Q5)"
@ -228,6 +229,7 @@
},
"rulings": [
"cultmath-tapes:ruling:operator-ground-void-brush",
"cultmath-tapes:ruling:operator-void-true-cavity",
"cultmath-tapes:ruling:operator-tile-amortized-march",
"cultmath-tapes:ruling:operator-split-phacelle",
"site-masthead:ruling:operator-chromeless-column"
@ -235,6 +237,6 @@
"questions": [
"Q4 in the map: palette input tokens (a, recommended)",
"Q5 in the map: carry the last sampled wash across page loads (a, recommended)",
"Q7 in the map: the brush carves a bowl in a cloud floor as the original (a, recommended) or a 3D spherical cavity in a cloud volume (b)"
"Q8 in the map (cavity-contract): which number the shipped cavity scene promises"
]
}

View file

@ -331,21 +331,21 @@ TFLOP available; estimates, replaced by measurement):
| Pass | Work | ms |
| --- | --- | --- |
| Flow texture, quarter res | 160 k texels × 2 snoise | 0.05 |
| Tile pre-pass (pass 3), 1/64 res, `N = 8` | 40 k tiles × ≤ 144 probes, mostly envelope-only; in the void most sky tiles finish in a few probes; ≈ 0.4–2 snoise-equivalents per pixel, measured | 0.2–0.8 |
| March at `S = 8` | 2.6 M × 8 snoise, placed in unmasked cells only, plus the analytic sun light (one length, one pow per sample, ≈ 5%) | 3.3 |
| Tile pre-pass (pass 3), 1/64 res, `N = 8` | 40 k tiles × ≈ 30 probes in the cavity (interior retired in a few, the wall's ≈ 15 cells at 1.5 probes each), envelope-only because the noise ball cannot prove anything at this scale; ≈ 0.1 snoise-equivalents per pixel; worst case ≤ 192 probes per tile | 0.1 (≤ 0.8) |
| March at `S = 8` | 2.6 M × 8 snoise, every pixel marches a wall (no sky pixel ends free), samples placed in unmasked cells only, plus the analytic sun light (one length, one pow per sample, ≈ 5%) | 3.3 |
| TAA resolve + DoF gather | ~19 texel reads per pixel, plus the depth-history fetch and one matrix multiply for the camera reprojection | 1.1 |
| Sun self-shadowing sample (named, not taken) | one envelope-only transmittance sample per primary sample, ≈ +25% of the march | +0.8, not on the phone |
| Stardust layer, half res, 4,096 particles | fill-bound, small | 0.2 |
| 8×8 downsample + PBO readback at 2 Hz | tiny | 0.05 |
| **Total at `S = 8`, the void scene (pass 3)** | | **≈ 4.9** |
| Total at `S = 6` / `S = 4` | | ≈ 4.0 / 3.2 |
| **Total at `S = 8`, the cavity (pass 3)** | | **≈ 4.8** |
| Total at `S = 6` / `S = 4` | | ≈ 3.9 / 3.1 |
Said plainly: at `S = 8` the void scene with the pre-pass, the analytic light
and the camera reprojection does not fit the 4 ms phone budget on the
estimate; `S = 6` sits at the line and `S = 4` is under it. The controller
will settle a mid-range phone at `S = 4–6`, which the TAA covers (convergence
in ~32 frames, about a second), and the pre-pass is what makes `S = 4` look
like more: the samples land only on the walls. What gives, in order, is the
Said plainly: at `S = 8` the cavity with the pre-pass, the analytic light and
the camera reprojection does not fit the 4 ms phone budget on the estimate;
`S = 6` sits at the line and `S = 4` is under it. The controller will settle
a mid-range phone at `S = 4–6`, which the TAA covers (convergence in ~32
frames, about a second), and the pre-pass is what makes `S = 4` look like
more: every ray's samples land in its wall, none in the hollow. What gives, in order, is the
sample count, then the resolution; the stardust and the DoF are never dropped
before the clouds' samples; the self-shadowing sample is not taken on any
device until measured. On desktop at `S = 16` the stack is ≈ 1.9 ms.
@ -522,10 +522,12 @@ warped points of 2,000 slices, no tolerance).
| (b) inside the fog | `h = 0`, camera at `y = F − 10`, rays level | 0.8–1.0x: every ray saturates in a few cells; the pre-pass still probes the whole grid |
| (c) Aetheria-like | zone bowl `R = 2000` + four wells (masses 100, 1000, 10000, 1000), camera above the fog in the bowl, rays gazing across (`m_y ∈ [−0.25, 0.1]`), Aetheria's units and 256-sample quadratic grid | 2–4x: the clear cells before the fog surface collapse to a few probes per tile; the fog cells cost the same on both sides. The noise ball proves nothing at Aetheria's scale (`L r F0 ≥ 1.6` at the finest cell with `D = 60`), so it is not evaluated; the saving is the envelope's |
| (d) uniform slab | r1's field, kept as the worst case | 1.3–1.5x: the ceiling at `L = 10.099261` with the cheaper baseline |
| (e) the void, the shipped scene | the original's bowl and units, camera inside the bowl at `y = −105`, rays over the whole frustum | 2–3x: sky rays go from 96 envelope evaluations to a few probes per tile; wall rays cost the same on both sides; the mix decides. The noise ball proves nothing here either (`L r F0 ≥ 1.5` at the finest cell) |
| (e) the void, the shipped scene | the true cavity in the original's units (`Rc = 640`, `Rh = 198`), camera 186 from the centre, low, rays over the whole frustum; every ray crosses 14–380 units of interior and ends in a wall | **1.0–1.2x on combined cost, under 2x.** With no sky the interior costs the dense march only envelope evaluations (≈ 20 × 0.2 per ray against ≈ 15 wall cells × 3.2) and the pre-pass can only remove those; the noise ball proves nothing (`L r F0 ≥ 1.5`). What the pre-pass buys here is sample placement: at the site's `S` the samples land in the 150-unit wall ramp instead of the whole ray, a 2.0–2.6x effective sample density (printed as marched length over wall length) |
The 2x contract is asserted on (a), (c) and (e) at `N = 8`; (b) and (d) are
printed. The headline is (e). A shortfall skips the assertion naming `saving-2x-scenarios`; the
The 2x contract on combined cost is asserted on (a) and (c) at `N = 8`; (b)
and (d) are printed. (e) is the headline and prints both its numbers; which
one it promises is Q8 (`cavity-contract`), and until that is ruled its
assertion skips naming the question. A shortfall skips the assertion naming `saving-2x-scenarios`; the
fields, grids and `e` are not tuned. The honest summary: at a Lipschitz bound
near 10 the noise ball is weak everywhere; what intervals buy on these fields
is the envelope's empty space, found exactly, and the tiles make finding it
@ -559,18 +561,38 @@ pivot, `Materials/Brushes/Gravity Well.mat` and
| Noise | strength 150, frequency 0.01, safety 50 |
Not surviving: the 2021 `d()` displacement details (the 2021-05-30 "Volumetric
Redux" rewrote it), the tint map's runtime contents, the video. The brush is
radial in `xz` and carves a bowl in a cloud floor; "spherical" in the
operator's words is the brush, not a 3D cavity (Q7).
Redux" rewrote it), the tint map's runtime contents, the video. The 2021
brush was radial in `xz` and carved a bowl in a cloud floor; the operator
ruled (Q7, `operator-void-true-cavity`) that the site's void is a true 3D
hollow inside a cloud volume that surrounds it on every side, including
above. Everything else recovered carries over.
**The site scene** (`site-ground` r3): the same units. `h(xz) = 75 + 40 (1 −
(r/256)²)^16`, `s = y + h − F`, `F = −16.46`, fog where `s' < 0`, `S = 50`,
`A = 20` (the original's 150 is too violent for a 40-deep bowl), `F0 = 0.01`.
The sun orbits the origin at radius 175, period 72 s, `y = −130`; the void
moves with it. The camera follows 150 behind along the tangent at `y = −105`:
inside the bowl, 14 below the rim, looking at the orbit centre at the sun's
depth, with a slow handheld drift. `worldAt(t)` in `ground.js` is the one
owner of sun, void and camera; nothing integrates motion. The flow is authored
**The site scene** (`site-ground` r3): the original's units. Outer volume: an
unbounded uniform fill (chosen over a shell: every ray then ends in a wall
and the march terminates by opacity, never by a far plane; `Z1 = 2 Rc` bounds
the pre-pass range only). The carve: `d = |p − c_v|`, `g(d) = (1 −
(d/Rc)²)^4` for `d < Rc`, `Rc = 640`, `CARVE = 1.5`; `density = K · max(0,
1 − CARVE · g(d'))`, exactly 0 inside the hollow radius `Rh = Rc √(1 −
CARVE^(−1/4)) = 198`, half at `0.49 Rc`, full at `Rc`; `K = 1/30`, so a wall
is opaque within ≈ 150 units of entry. Noise displaces the wall only:
`fade(d) = smoothstep(Rh − S, Rh, d)`, `S = 50`, `d' = d + A · fade · n`,
`A = 20`, `F0 = 0.01`. Its bound over a tile's slice: `d`'s interval is the
box's least and greatest distance to `c_v` (exact); `g`, `fade` and the carve
are monotone in it; the slice is provably empty iff `d_hi + A · fade(d_hi) ·
n_hi ≤ Rh`, and deep inside (`fade = 0`) no noise is evaluated. `Rc` grew
from the brush's 256 because a 3D hollow must hold the camera.
The sun orbits the origin at radius 175, period 72 s; the cavity centre is
`c_v = sun + (0, Rh − 12.5, 0)`, so the sun sphere rests on the hollow's
bottom and the hollow moves with it. The camera follows 120 behind the sun
along the tangent and 45 above it: 186 from `c_v`, 12 inside the hollow, low,
looking at `sun + (0, 60, 0)` so the lit lower wall and the dark upper wall
share the frame. The 2021 follow distance 150 and height 25 do not fit a
hollow a camera can stand in; 120 and 45 are the re-derivation. There is no
sky: behind a fully transmissive pixel the resolve shows the base token, and
only an unfinished ray (budget exhausted before the wall, measured, under 1%)
reaches it. `worldAt(t)` in `ground.js` is the one
owner of sun, cavity and camera; nothing integrates motion. The flow is authored
around the void: a swirl `SWIRL · tangent · (1 − (r/Rw)²)²` (largest
mid-slope, zero at rim and centre) plus the global noise flow, rendered into a
world-space window of side `4 Rw` around the sun, so warp, hue, motion vectors
@ -578,11 +600,13 @@ and the stardust read one texture (D4). The stardust (next cut) spawns in the
bowl with the original's height rule and is lit by the same pulse.
**Lighting, cheapest moody version:** the original's mechanism made 3D. At a
sample, `light = SUN · (1 − (d/Rl)²)^3` for `d = |p − sun| < Rl = 128`, plus
the blue ambient; `colour = density · (light + ambient) · hue(flow)`. Zero
extra `snoise`; the far cavity stays dark because the pulse is zero beyond
`Rl`; the sun is a small additive disc in the resolve, occluded by the
accumulated transmittance. A self-shadowing step (one envelope-only
sample, `light = SUN · (1 − (d/Rl)²)^3` for `d = |p − sun| < Rl = Rh = 198`
(the original's 128 scaled with the hollow), plus the blue ambient; `colour =
density · (light + ambient) · hue(flow)`. Zero extra `snoise`; the lower wall
within `Rl` of the sun glows and the upper wall stays dark because the pulse
is zero beyond `Rl`, which is the moody split; the sun inside the hollow is
occluded by nothing, so it is a small additive disc in the resolve, occluded
only by the accumulated transmittance along its ray. A self-shadowing step (one envelope-only
transmittance sample toward the sun per primary sample, no noise, ≈ +25% on
the march) is named, not taken: desktop-only if measurement ever allows.
@ -650,14 +674,24 @@ timeouts are reported as timeouts, not kills.
`cultmath-tapes:ruling:operator-ground-void-brush`: the old main menu's void
(pass 3, "The site ground: the void").
**Q7. What "spherical" means for the brush.**
- (a) As the original: the brush is radial in `xz` and carves a bowl in a
cloud floor; the sun sits at the bowl's bottom; clear sky above the rim.
**Recommended**: it is the scene that existed, and its parameters survive.
- (b) A true 3D spherical cavity in a cloud volume (clouds above as well as
below, the sun at the cavity's bottom). The culling is the same (the
envelope is monotone in distance either way); the look is more enclosed and
the sky, stardust and DoF composition changes.
**Q7. What "spherical" means for the brush.** Ruled
`cultmath-tapes:ruling:operator-void-true-cavity`: a true 3D hollow inside a
cloud volume that surrounds it on every side, including above; not the 2021
bowl.
**Q8. `cavity-contract`: which number the shipped cavity scene promises.**
The proving-ground contract's "2x fewer evaluations at equal transmittance"
cannot hold in a cavity with no sky (prediction 1.0–1.2x, above), because a
pointwise-gated dense march already pays almost nothing in the hollow. The
pre-pass's real gain there is where the samples land.
- (a) (e) is asserted on the placement ratio (marched length over wall
length per ray, ≥ 2x, predicted 2.0–2.6x); the cost-ratio 2x stays on (a)
and (c). **Recommended**: it is the number that describes the shipped
gain, and it is still a measured property of the same march.
- (b) (e) is printed only; the contract stays on (a) and (c); the browser
measurement (variance at the walls, snoise per pixel) is the shipped
scene's evidence.
- (c) Relax the contract for (e) to the measured cost ratio.
Specs for pass 3: `docs/cultmath-interval-ground-cut-site-ground.r3.spec.json`
beside the two CultLib r2 specs.