Skip to main content
Documentation menu
On this page

Display

Volume Shader Benchmark

A repeatable volumetric-shader benchmark with a warm-up, a transparent score and a controlled comparison mode.

  • Available — Live on this site right now.
  • Browser Tool — Runs in the browser you are reading this in.
  • No Install — Nothing to download, no extension, no account.
  • Client-Side — Runs entirely on your device. No test data is uploaded.

Live tool: /volume-shader-benchmark/

This page explains the tool. The tool itself is one click away and needs no sign-in.

Open Volume Shader Benchmark

What is this tool?

The Volume Shader Benchmark runs the same volumetric ray-marching family as the Volume Shader Test, but built for repeatable measurement rather than free exploration. It renders through WebGL2 GLSL 3.00 ES, excludes a warm-up period, and turns the result into a single transparent score you can compare across runs of the same configuration.

It also runs an honest WebGPU probe — navigator.gpu.requestAdapter() — and reports whether WebGPU is available for information only. The benchmark itself always renders through WebGL2; the probe never changes the workload or the score.

As with every GPU tool here, all metrics come from timing real frames with performance.now(). No GPU temperature, power, clock, utilisation or VRAM figure is produced or implied.

How to use it

  1. Choose the workloadSet Ray Steps (32-192, or a custom 16-256), Volume Complexity (1-4 octaves), Density, Lighting (ambient / shadows / phase) and Render Scale. These define the workload the score is tied to.
  2. Pick a duration and runDuration is 10, 20, 30 or 60 seconds. Start the run; a default two-second warm-up compiles shaders and settles memory, and those frames are excluded from the result.
  3. Read the score and metricsWhen the run completes you get the benchmark score, effective FPS, average and 1% low FPS, frame time, jitter, stability and a stability rating, plus render resolution and ray steps.
  4. Use the controlled comparison suiteThe second tab runs several configurations back to back — for example ray steps 32 vs 64 vs 128 — each with its own warm-up, so you can compare one variable at a time on your own hardware.

What the results mean

Benchmark score

The score is round(workUnitsPerFrame × effectiveFps), where workUnitsPerFrame = renderPixels × raySteps × perSampleCost / 1e6 and perSampleCost = 1 + 0.35 × (octaves − 1) + 0.25 × lightingMode. It is a weighted count of millions of volumetric samples per second, built entirely from measured throughput — no hardware data enters it.

Effective FPS

effectiveFps = 0.75 × average FPS + 0.25 × 1% low FPS. Blending in the 1% low means a run that stutters cannot score as highly as a smoothly paced run at the same average.

1% low, jitter and stability

The 1% low is the mean of the slowest 1% of frames as an FPS; jitter is the mean absolute consecutive frame-time difference; stability is clamped(100 − jitter × 6.5). The stability rating reads Excellent, Good, Variable or Unstable.

Partial and interrupted runs

Stopping early returns a result flagged as not having completed the full duration, or nothing at all if you stop during warm-up. Partial runs are labelled and are not comparable to full runs.

The formula

These are the expressions the calculator evaluates, written out so you can reproduce any result by hand.

Per-sample costperSampleCost = 1 + 0.35 × (octaves − 1) + 0.25 × lightingModeoctaves = 1/2/3/4 for low/medium/high/extreme complexity; lightingMode = 0/1/2 for ambient/shadows/phase.
Work units per frameworkUnitsPerFrame = (renderPixels × raySteps × perSampleCost) / 1e6renderPixels is the canvas width × height after render scale; measured in millions of volumetric samples.
Effective FPSeffectiveFps = 0.75 × avgFps + 0.25 × onePercentLowFpsBlends in the 1% low so a stuttering run cannot match a smooth one at the same average.
Scorescore = round(workUnitsPerFrame × effectiveFps)Comparable only between runs with an identical configuration. No hardware data enters it.

What it can detect

  • A repeatable, configuration-locked score for volumetric shader throughput
  • How a single variable — ray steps, octaves, lighting — changes performance, via the controlled comparison suite
  • Whether frame pacing holds, through the effective-FPS blend and the stability rating
  • Whether your browser also exposes a WebGPU adapter (reported for information only)

Limits worth knowing

A browser can only report what the platform gives it. These are the honest boundaries of this page, so a result is never read as more than it is.

  • The score is only comparable between runs with an identical configuration. Because it multiplies in resolution, ray steps, octaves and lighting, changing any of them changes the scale — that is by design, not a fault.
  • It cannot read GPU temperature, power, clocks, utilisation or VRAM; none is part of the score or shown anywhere.
  • The WebGPU line is a capability probe only. It tells you an adapter exists, not that anything was rendered with WebGPU — this benchmark always uses WebGL2.
  • A partial run (stopped early) is flagged and should not be compared against a full-duration run.
  • Frame rate is bounded by the display refresh rate through requestAnimationFrame, and there is no background-tab pause, so keep the tab focused.

Tips

  • For a fair comparison between two machines or settings, fix every control and the duration, then read the score — it already folds in the 1% low so you do not have to eyeball stutter.
  • Use the controlled comparison suite to isolate one variable; it warms up each phase separately so the phases are directly comparable.
  • Runs from this browser session are kept in an on-page history that dims configurations that do not match, so you do not accidentally compare unlike runs.

Troubleshooting

Are the warm-up frames in my score?

No. The default two-second warm-up is fully excluded — the frame clock and metric buffers reset when measurement begins, so shader-compilation cost never counts toward the result.

It says WebGPU is available — is the benchmark using it?

No. That line is an honest capability probe. The benchmark always renders through WebGL2; the probe only reports whether a WebGPU adapter exists on your system.

Why can't I compare my score to a run with different settings?

The score deliberately scales with resolution, ray steps, octaves and lighting, so only identical configurations are comparable. The on-page history dims runs whose configuration does not match.

Ready to run it?

A repeatable volumetric-shader benchmark with a warm-up, a transparent score and a controlled comparison mode. Nothing to install, and it opens in this browser.