TEMPEST · FOLLOW-UP VERIFICATION · 01 October 2026 · 07:47 JST

Light shaped by waves.
Not painted onto water.

The repeating sine-pattern dots were removed. The replacement refracts light through the live FFT wave geometry and normals, accumulates ray convergence/divergence in eight depth slices, then projects the resulting illumination onto underwater receiver surfaces.

0.29 msphoton + filter GPU mean
174 timestamp samples, marker overhead included
2 backendsshared TSL graphs
WebGPU and WebGL2 verified
21 / 21unit tests pass
4 new optics tests
0.048%dry-cabin SSIM difference
RGB MAE 0.034%

What changed

Technique background: Evan Wallace’s differential-area caustics. Irradiance enters the existing Three.js lighting model rather than being applied as emissive paint.

Correctness and bounds

Flat-water GPU probes on both backends matched expected uniform flux 0.688452 with maximum absolute error 0.000464 (half-float quantization). Moving-wave maps contained no non-finite samples; the map fingerprint changed between simulation times 3.65 s and 4.65 s. Calmer 15% weather and 100% tempest were checked. The dry-cabin A/B comparison remained below the 1% regression gate.

This is a real-time single-light approximation, not full path tracing. Horizontal depth slices are interpolated; storm transmission is a fitted weather envelope, not full cloud shadow ray tracing. Outer-glass refraction, complete underwater self-occlusion, multiple scattering and multi-bounce caustics are not solved. The finite footprint limits singular peaks. No promise of photographic realism or universal 60 FPS is made.

Frame-time evidence

Current viewport 1339 × 1342, DPR 1, Cinematic. Short diagnostic runs use 60 warmup + 120 samples; the second-phase timestamp run uses 180 samples. FPS counts GPU-completed frames, with at most two frames queued.

RunBackendStormFPSFrame msCPU msGPU ms
caustics-calm-gpuThree.js WebGPU (TSL)15%50.519.8110.3617.21
caustics-gpu-finalThree.js WebGPU (TSL)100%61.816.189.3213.16
caustics-gpu-offThree.js WebGPU (TSL)100%63.715.699.1512.73
caustics-gpu-repeatThree.js WebGPU (TSL)100%56.317.7710.1115.55
caustics-phase2-gpuThree.js WebGPU (TSL)100%49.120.3510.0117.57
caustics-wave-glThree.js WebGL2 (TSL)100%27.037.0613.3166.18

The isolated photon/filter timestamp bracket measured 0.286 ms mean, 0.459 ms p95 over 174 returned queries. It is not added to whole-frame GPU timings. Whole-scene measurements vary with host load and shader/cache state, so the A/B difference is not treated as a precise causal estimate or a locked-60 guarantee. These tests do not replace the original optimization convergence study.

Development accounting

GPT 6.1 Sol at Max Effort (Not Fast). Observed metadata: {"model": "gpt-6.1-sol", "effort": "max", "service_tier": null}.

42:19since first saved capture
9,886,943logged follow-up tokens
includes repeated cached inputs
45,418follow-up output tokens
reasoning already included
$1.7146hypothetical Standard API equivalent

Follow-up cached input: 9,696,128; uncached input: 145,397. Cumulative task snapshot: 129,980,925 tokens; hypothetical cumulative model-token cost $35.8699. Latest usage: 2026-09-30T22:46:00.565Z. This is not a subscription charge or invoice. Rates and long-context treatment were checked against official OpenAI API pricing on 1 October 2026 JST. Standard tier is an explicit pricing assumption. Tool, hosting, tax, hardware, and subsequent/unreported tokens are excluded. The earlier final report’s snapshot stays unchanged.

Saved development frames

Each original screenshot is paired with its exact save-time elapsed measurement and the latest logged token snapshot at or before capture. The early camera-initialization failure is retained, not hidden. Captions are external to the unedited screenshots.

Actual photon field

Eight wave-refracted light-flux depth slices
Grayscale light-flux diagnostic, not the final scene color. Black regions include the ship footprint and bottle boundary clipping.

Return to the live scene · Original development & optimization report