Fieldproof measures the scene you're actually running, flags the settings that break your frame budget, and packages the result for Godot or the web.
Runs client-side. No account needed for the free Ship Check.
Beautiful browser demos routinely fail the moment you try to ship them. Fieldproof exists because three specific failures keep happening.
A scene that runs at 60 fps on your workstation drops to 22 fps on a mid-range laptop the moment fog and reflections both light up. You don't see the cliff until a teammate reports it.
Browser pipelines (bloom, temporal, N-bounce reflections, volumetric fog) don't fit a single Godot canvas_item shader. Nothing warns you at export time — the port just looks wrong.
"It runs fine on my machine" is not a handoff. Reviewers and teammates want to see what settings, what browser, what frame time, what budget.
One measured pass from author to handoff. Ordered on purpose — the export only means something after the measurement.
Author a scene in the Workbench with live GLSL hot-swap, or paste a scene from a share link. Compile errors are shown in place, with line numbers remapped to your source.
Pick a target profile (Godot desktop 60 fps, web mid 60 fps, mobile web 30 fps), then sample the scene running right now for ~2.5 seconds. Get a plain-language report of what fits and what doesn't.
Take the fixed scene out as a working Godot 4 project, a standalone HTML page, a PNG capture, a WebM recording, or an STL mesh. The hardware report bundles the GPU context the measurement was made on.
Only claims backed by the code that runs in your browser.
Live GLSL hot-swap. Compile errors surface with line numbers remapped to your source. If the shader fails to compile, Ship Check is Blocked — never guesses.
Uses EXT_disjoint_timer_query_webgl2 when the driver exposes it. Falls back to a requestAnimationFrame delta when it doesn't. The Ship Check report labels which source it used.
Step-count heatmap, normal debug, and average-step readback from the render target. See where the marcher is spending its budget instead of guessing.
Sweep maxSteps, resolution, or repetition and get a real frame-time curve. Bisection search picks the largest maxSteps that holds your target fps.
The report enumerates enabled features (fog samples, bounces, SSS, bloom, temporal) so you know exactly what is driving the number.
Unmasked WebGL vendor/renderer where the browser allows it, extensions, viewport, device pixel ratio. Ships alongside exports so reviewers know the context.
Read from the export code, not marketing checkboxes.
| Feature | Browser | Godot export | Note |
|---|---|---|---|
| SDF primitives + smooth blends | Supported | Supported | Direct GLSL ⇢ .gdshader port of your map() body. |
| Shadows / AO | Supported | Supported | Ported into the Godot shader. |
| Volumetric fog | Supported | Not carried | Multi-sample fog is browser-only. |
| N-bounce reflections | Supported | Not carried | Requires multi-pass; Godot export is one canvas_item shader. |
| Subsurface scattering | Supported | Not carried | Multi-channel inward march is browser-only. |
| Bloom / temporal accumulation | Supported | Not carried | Post pipeline runs on FBO chain — not carried into Godot. |
| Dynamic resolution | Supported | Partial | Godot scene lets you scale render viewport at runtime. |
| Mesh export (STL) | Supported | n/a | Marching cubes on the JS side. |
| Standalone HTML export | Supported | n/a | Single self-contained .html — drop on any static host. |
Supporting R&D that shares the raymarching engine — not the product thesis.
Run a measured Ship Check against your target, fix the bottleneck it flags, and export a handoff you can defend.