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
Snell refraction with water IOR 1.333; additive differential-area photon flux, not a looping caustic bitmap.
Weak scattered light at the wet inner bottle boundary; no emissive dots in the water bulk.
Ship waterline photon occlusion and explicit exclusion of enclosed dry interiors. Whale skin maps, folds, eyes, geometry and prior absorption are retained.
Two fixed half-float render targets; one instanced projection draw and one filter draw per live update. Paused unchanged fields are reused. No normal-frame GPU readbacks.
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.
Run
Backend
Storm
FPS
Frame ms
CPU ms
GPU ms
caustics-calm-gpu
Three.js WebGPU (TSL)
15%
50.5
19.81
10.36
17.21
caustics-gpu-final
Three.js WebGPU (TSL)
100%
61.8
16.18
9.32
13.16
caustics-gpu-off
Three.js WebGPU (TSL)
100%
63.7
15.69
9.15
12.73
caustics-gpu-repeat
Three.js WebGPU (TSL)
100%
56.3
17.77
10.11
15.55
caustics-phase2-gpu
Three.js WebGPU (TSL)
100%
49.1
20.35
10.01
17.57
caustics-wave-gl
Three.js WebGL2 (TSL)
100%
27.0
37.06
13.31
66.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.