Repository navigation
Releases
raw-native 0.8.0
raw-native renders a scene on the CPU reference and on the GPU, checks one against the other, and writes a certificate saying whether they agree within committed tolerances. Version 0.8.0 makes the lit scenes of 0.7.0 pass more of their own checks: screen-space reflections that know when a ray went behind a surface, near-plane clipping in the rasterizer, a path tracer that splits its light into diffuse, specular and emission, a Mandelbulb that passes its march bounds, and correctly rounded division in the engine's own rasterizer.
Download and run
| File | Platform |
|---|---|
raw-native-0.8.0-windows-x64.zip |
Windows 10 or 11, x64. CPU only, static runtime, no installer. |
raw-native-0.8.0-windows-x64-d3d12.zip |
Windows 10 or 11, x64, with the D3D12 backend. --gpu needs a hardware GPU. |
raw-native-0.8.0-linux-x64.tar.gz |
Linux x64 with glibc 2.38 or newer. |
raw-native-0.8.0-wasm.zip |
Browser or Node: the CPU build and the WebGPU build. Also published loose. |
raw-native-0.8.0-viewer.zip |
The verified viewer with every file it loads. Serve the folder from any static host and open web/viewer/index.html. |
Every archive carries LICENSE (FSL-1.1-MIT) and LICENSE-superstack.txt.
sha256sum -c SHA256SUMS
raw_native_cli --out ./out
raw_native_cli verify ./outWhat is new
- Screen-space reflections that see behind a surface. SSR marches one step a pixel and reads a second, peeled depth layer, so a ray that enters a solid through a face the camera cannot see ends as a miss. SSR on raw-hall's nave passes its bounds: 90.53% correct and 9.55% false hits, from 68.3% and 11.8%.
- Near-plane clipping. Triangles that cross the camera plane are clipped instead of dropped, so close views keep their ground. GTAO and SSR on raw-hall's gallery now pass.
- Path tracer split radiance. Diffuse, specular and emission radiance, the two albedos and their variances, on the CPU and on the GPU. Every earlier output keeps its bytes.
- Mandelbulb march. The surface refinement keeps its bracket in double-float, and the bulb passes its unchanged bounds on WARP and SwiftShader.
- Correctly rounded division in the rasterizer. D3D12 permits approximate division, so the rasterizer now divides in integer arithmetic, rounded to nearest even, checked on 67 million random pairs.
- Hardware track. Inline ray queries, three-run hardware timings, and the first ray reconstruction models with their dataset tools. Model v3 beats SVGF on tone-mapped PSNR but fails on FLIP, temporal stability, RTX parity and the 2 ms budget; all are recorded as failures.
Upgrading from 0.7.0
- The 0.5 include paths (
raw/render.hpp,raw/vec.hppand 26 more) are removed. Includeraw/<layer>/<name>.hpp. They were due for removal in 0.7.0 and stayed one release longer by mistake. - API snapshot 3: two
SsrParamsdefaults changed.api/snapshot-3/MIGRATION.mdsays how to keep the old behaviour.
The full list, with every bound and evidence file, is in CHANGELOG.md.
Merged after the tag
Shader lab 4 landed on main around the release, after the tag commit (5dd27ef), so it is not in these assets and ships in the next release:
- #122: a pixel-locked CRT shadow mask and the
pvm-20-softpreset. - #126: temporal stability of the dither modes, measured (
tools/shaders/dither_temporal.mjs). - #128: the lab 4 blind panel results; the pixel template now uses
mix-bayer4.
Checked before release
- The default render's
certificate.json,receipt.json,channels.json,frame.ppmand both AO files are byte-identical from the packaged Windows, Windows D3D12, Linux and CPU wasm builds (certificate.jsonSHA-2564222e191...).raw_native_cli verifypasses on the wasm and D3D12-build outputs. - Both identity goldens were re-rendered. Only the certificate and receipt files, which carry the version string, changed; every image and AO file keeps its hash. GCC 13.3 matches both goldens on every file; the packaged Windows CLI matches the identity golden (11 cases, 109 files).
- ctest passes 60 of 60 with MSVC and with GCC 13.3. CI passed 15 of 15 jobs on this commit.
- The packaged viewer rendered raw-hero and raw-hall
verifiedin Chrome on SwiftShader, inside the Studio at desktop and phone widths. - Not checked for this release: a render on a hardware GPU. The RTX 4090 was held by other work.
raw-native 0.7.0
raw-native renders a scene on the CPU reference and on the GPU, checks one against the other, and writes a certificate saying whether they agree within committed tolerances. Version 0.7.0 brings lit scenes: physically based materials, punctual and image lighting, cascaded shadows, GTAO, screen-space reflections, TAA, baked lighting, a verified glTF viewer, its own rasterizer and ray tracer, and a numbered C++ API snapshot.
Download and run
| File | Platform |
|---|---|
raw-native-0.7.0-windows-x64.zip |
Windows 10 or 11, x64. CPU only, static runtime, no installer. |
raw-native-0.7.0-windows-x64-d3d12.zip |
Windows 10 or 11, x64, with the D3D12 backend. --gpu needs a hardware GPU. |
raw-native-0.7.0-linux-x64.tar.gz |
Linux x64 with glibc 2.38 or newer. |
raw-native-0.7.0-wasm.zip |
Browser or Node: the CPU build and the WebGPU build. Also published loose. |
raw-native-0.7.0-viewer.zip |
New: the verified viewer with every file it loads. Serve the folder from any static host and open web/viewer/index.html. |
Every archive carries LICENSE (FSL-1.1-MIT) and LICENSE-superstack.txt.
sha256sum -c SHA256SUMS
raw_native_cli --out ./out
raw_native_cli verify ./outWhat is new
- Verified viewer. Open a glTF or GLB file; the page renders it through WebGPU and on the CPU reference and shows both frames, the error map and the certificate. The owned assets raw-hero and raw-hall load with one click. It now ships as its own asset, so a site can host it unchanged.
- Materials. The glTF 2.0 model with clearcoat, sheen, transmission, volume, iridescence and anisotropy, checked by white furnaces and reciprocity. A white metal under a clear coat stays within 1.12% of a white furnace and at most 5.9e-4 above it. The anisotropic table is generated once and embedded, with its hash checked in CI.
- Lighting and shadows. Clustered punctual lights, split-sum image lighting, and four stable shadow cascades that match the CPU rasterizer on D3D12.
- Post. GTAO, screen-space reflections and TAA on the CPU, D3D12 and WebGPU. TAA meets its RMSE (0.442 of single-sample against 0.5) and ghosting (0.0056 against 0.03) bounds.
- Baked lighting. Radiosity normal maps and ambient cubes, baked by the CPU ray tracer.
- Own rasterizer and ray tracer. A triangle rasterizer that matches its CPU reference bit for bit on WARP and SwiftShader, a compute-built BVH, a path tracer, and an SDF scene graph.
- API snapshot 2. The renderer and scene headers are a numbered snapshot with a declaration dump checked in CI and a compatibility suite. Snapshot 2 changed three grid constants;
api/snapshot-2/MIGRATION.mdsays how to update.
The full list is in CHANGELOG.md.
Checked before release
- The default render's
certificate.json,receipt.json,channels.json,frame.ppmand both AO files are byte-identical from the packaged Windows, Windows D3D12, Linux and CPU wasm builds (certificate.jsonSHA-256c8d08312...).raw_native_cli verifypasses on the wasm output. - Both identity goldens were re-rendered with GCC 13.3. Only the certificate and receipt files, which carry the version string, changed; every image and AO file keeps its hash. The MSVC build matches the identity golden (11 cases, 109 files).
- ctest passes 59 of 59 with MSVC and with GCC 13.3.
- A 1440 x 900 D3D12 render on an RTX 4090 gave a
verifiedGPU certificate, andverifypassed on it. - The packaged viewer rendered raw-hero and raw-hall
verifiedin Chrome on an RTX 4090.
Limits
- Open failures, with bounds unchanged: screen-space reflections on raw-hall (68% and 65% correct against 90%), GTAO on raw-hall's gallery (mean 0.073 against 0.05), and the G-buffer normal identity on raw-hall's column slivers. Each is recorded in
evidence/. - The plugin C ABI is not built; that part of the API criterion is deferred until a plugin consumer exists.
- Agreement with the CPU is not agreement with ground truth.
Licensed FSL-1.1-MIT. Version 0.2.0 and earlier stay MIT.
v0.6.0
raw-native renders a test scene, computes ambient occlusion two ways, and writes a certificate saying whether the fast screen-space estimate held against a ray-traced reference. Version 0.6.0 adds a GPU host for the web, two creative modules, a mathematical-animation layer, and a media engine. The engine renders this release's own explainer video and walkthrough from this release's own output.
Download and run
| File | Platform |
|---|---|
raw-native-0.6.0-windows-x64.zip |
Windows 10 or 11, x64. CPU only, static runtime, no installer, loads only KERNEL32.dll. |
raw-native-0.6.0-windows-x64-d3d12.zip |
Windows 10 or 11, x64, with the D3D12 backend. --gpu needs a hardware GPU. Adds only d3d12.dll and dxgi.dll. |
raw-native-0.6.0-linux-x64.tar.gz |
Linux x64 with glibc 2.38 or newer. |
raw-native-0.6.0-wasm.zip |
Browser or Node: the CPU build and the WebGPU build. Also published loose. |
sha256sum -c SHA256SUMS
raw_native_cli --out ./out
raw_native_cli verify ./outWhat is new
- Media at every release.
raw-native media renderturns a repo'sdocs/media/media.jsoninto videos, reading every number from the commit it runs at.- Each scene gets its video, a poster, captions, an interactive page with the engine beside it, and a manifest of hashes.
- Walkthroughs record what each command really prints and draw it as a guided terminal session.
- A reusable workflow,
.github/workflows/media.yml, renders on a runner with no GPU through Chrome's CPU WebGPU adapter and attaches the result to the release. Any repo can call it. - This release's media, "Checking the light" and a first-run walkthrough, is attached below by that workflow. See ADR 0012.
- Motion, a mathematical-animation layer (
web/motion/, ADR 0011). A scene is a pure function of time. It provides:- Bezier paths drawn with analytic anti-aliasing on the GPU;
- morphs between shapes, text and equations by point correspondence;
- glyph atlases from any font you may redistribute, and a small TeX subset;
- live plots and GPU particle formations;
- a camera that moves through scale with depth of field.
One scene file plays live, with scrub, frame step and parameters, and renders frame-exact to video through the browser's hardware encoder: about 25 ms a frame at 3840 x 2160 on an RTX 4090.
- Web GPU host (
web/raw-gpu.mjs, ADR 0010). WGSL compute and render pipelines, the frame graph and per-pass GPU timing on WebGPU, in one dependency-free module. - Threads and Worlds.
- Threads: particles flowing along fifteen form fields.
- Worlds: fifteen raymarched dioramas you can walk around.
Both are creative modules with no CPU reference and no certificate, and both composite under Motion.
Checked before release
- The default render's
certificate.json,receipt.json,channels.json,frame.ppmand both AO float files are byte-identical from the packaged Windows, Windows D3D12, Linux and CPU wasm builds. Thecertificate.jsonSHA-256 isa65bf9b6.... - Against 0.5.1,
frame.ppm, both AO float files andchannels.jsonhash the same.certificate.jsonandreceipt.jsondiffer only through the version string. raw_native_cli verifypasses on the Windows, Linux and wasm output. The packaged Windows and Linux archives were unpacked and run.- 36 of 36 tests pass with MSVC and with GCC 13.3. The D3D12 build adds the hardware runtime test (37 of 37 on an RTX 4090).
- CI is green on the release commit, including the new media-smoke job. That job builds, reads the facts, records the walkthrough and renders the first seconds of each scene on a hosted runner with no GPU.
Limits
- The D3D12, WebGPU and WARP matrices and the benchmark were not rerun for 0.6.0. Their evidence is 0.5.0's, and the render code they measure is unchanged.
- Media files. The
-540pvideos are the workflow's renders: captions, no narration. The-1080pand-2160pvideos, the posters and the media zips are the narrated renders made on the author's machine, from the same commit's values. The narration is a synthesized version of the author's voice. - Sound, updated 10 October 2026. The
-1080pand-2160pvideos and the media zips now carry a mix from the sound engine (web/sound, merged after this release). The mix has the same narration, a score held 18 LU under the voice, and a few cues tied to what changes on screen. It is mastered to -16.0 LUFS integrated, with true peak at most -1.8 dBTP (ffmpegebur128). Pictures, facts and captions are unchanged. Each zip'smedia.jsonhas asoundblock, andsound/holds the sheet, report and receipt. The videos first attached carried the narration alone. They are kept, and the narration-only mix can be restored by swapping the files back. - Motion, Threads and Worlds are creative media: they make no claim about accuracy and write no certificate.
- One built-in scene. Agreement with the CPU is not agreement with ground truth: the CPU reference is itself a 64-sample estimate.
Licensed FSL-1.1-MIT. Version 0.2.0 and earlier stay MIT.
v0.5.1
raw-native renders a test scene, computes ambient occlusion two ways, and writes a certificate saying whether the fast screen-space estimate held against a ray-traced reference. Version 0.5.1 brings the superstack.receipt/1 receipt to the WebAssembly build, so every build now writes the same receipt beside its certificate.
Download and run
| File | Platform |
|---|---|
raw-native-0.5.1-windows-x64.zip |
Windows 10 or 11, x64. CPU only, static runtime, no installer, loads only KERNEL32.dll. |
raw-native-0.5.1-windows-x64-d3d12.zip |
Windows 10 or 11, x64, with the D3D12 backend. --gpu needs a hardware GPU; software adapters are refused. Adds only d3d12.dll and dxgi.dll. |
raw-native-0.5.1-linux-x64.tar.gz |
Linux x64 with glibc 2.38 or newer. |
raw-native-0.5.1-wasm.zip |
Browser or Node: the CPU build and the WebGPU build. Also published loose. |
Every archive carries LICENSE (FSL-1.1-MIT) and LICENSE-superstack.txt, the FSL-1.1-MIT notice for the vendored superstack header linked into the CLI.
sha256sum -c SHA256SUMS
raw_native_cli --out ./out
raw_native_cli verify ./outWhat is new
- The wasm build writes
receipt.json. raw-native now vendors superstack 0.2.0, whose header compiles with libc++, the standard library Emscripten uses. In 0.5.0 the wasm build printedreceipt: not written. Its receipt is now byte-identical to the receipts from the Windows and Linux builds, andraw_native_cli verifypasses on it. - superstack 0.2.0, licensed FSL-1.1-MIT.
superstack.hppis copied byte for byte from the superstack v0.2.0 release (SHA-256a0d223c0567c883b73ed74b19d93cb087e213dc14b950ab0f6f04206cb72c590). The vectors are unchanged.LICENSE-superstack.txtmoves from MIT to FSL-1.1-MIT. The notices for mulberry32, xmur3, OKLab and libebur128 are kept word for word. superstack 0.1.0, which 0.5.0 shipped, stays MIT. - CMake 4.2.0 is pinned for the wasm build. CMake 4.2 adds
-fPICto Emscripten compiles, so a build configured with another CMake gives different wasm bytes. The released wasm files are built with CMake 4.2.0 and emsdk 6.0.11.cmake --preset wasmwarns on any other CMake, and CI installs 4.2.0 and checks the wasm build used it. - A changelog.
CHANGELOG.mdcovers 0.2.0 to 0.5.1.
Checked before release
- The default render's
certificate.json,receipt.json,channels.json,frame.ppm,frame_hdr.pfm,mask.pgmand all AO files are byte-identical from the packaged Windows, Windows D3D12, Linux and CPU wasm builds (certificate.jsonSHA-256297f744d...,receipt.jsona1e5ffbe...). - Against 0.5.0,
frame.ppm, both AO float files,channels.jsonand every other image file hash the same.certificate.jsondiffers only in its version string.receipt.jsondiffers in its producer version, the certificate digest and the seal, all following from the version string. raw_native_cli verifypasses on every packaged build's output, wasm included, run with the Windows, Windows D3D12 and Linux binaries.- CI now requires the wasm receipt to match the Windows and Linux receipts, runs the superstack vectors under Emscripten in Node (383 of 383 checks), and checks the default render against the hashes 0.5.0 wrote.
- 34 of 34 tests pass with MSVC 19.50 and GCC 13.3. The D3D12 build adds the hardware runtime test, which passed on an RTX 4090 and which CI reports as skipped because the runner has no GPU. A 1440 x 900 D3D12 render on the RTX 4090 gave a
verifiedGPU certificate, andverifypassed on it and on its CPU reference.
Limits
- The D3D12, WebGPU and WARP matrices and the benchmark were not rerun for 0.5.1. Their evidence is 0.5.0's. The render code is unchanged. The binaries differ from 0.5.0's because of the new superstack header and the version string, and
raw-native-gpu.wasmis no longer the build that produced the WebGPU evidence. - The WebGPU build's
--gpupath was not run for this release. Its CPU render under Node writes the same files as the other builds. arena_certificate.jsonstill differs between platforms, because the standard libraries allocate different sizes. Each readsverified.- One built-in scene. Agreement with the CPU is not agreement with ground truth: the CPU reference is itself a 64-sample estimate.
Licensed FSL-1.1-MIT. Version 0.2.0 and earlier stay MIT.
v0.5.0
raw-native renders a test scene, computes ambient occlusion two ways, and writes a certificate saying whether the fast screen-space estimate held against a ray-traced reference. Version 0.5.0 adds a native D3D12 backend for Windows and a superstack.receipt/1 receipt beside every certificate.
Download and run
| File | Platform |
|---|---|
raw-native-0.5.0-windows-x64.zip |
Windows 10 or 11, x64. CPU only, static runtime, no installer, loads only KERNEL32.dll. |
raw-native-0.5.0-windows-x64-d3d12.zip |
Windows 10 or 11, x64, with the D3D12 backend. --gpu needs a hardware GPU; software adapters are refused. Adds only d3d12.dll and dxgi.dll. |
raw-native-0.5.0-linux-x64.tar.gz |
Linux x64 with glibc 2.38 or newer. |
raw-native-0.5.0-wasm.zip |
Browser or Node: the CPU build and the WebGPU build. Also published loose. |
Every archive carries LICENSE (FSL-1.1-MIT) and LICENSE-superstack.txt, the MIT notice for the vendored superstack header linked into the CLI.
sha256sum -c SHA256SUMS
raw_native_cli --out ./out
raw_native_cli verify ./outOn Windows with a hardware GPU, from the D3D12 archive:
raw_native_cli.exe --gpu --out out-gpu --width 1440 --height 900
raw_native_cli.exe verify out-gpuWhat is new
- Native D3D12. Built with
-DRAW_NATIVE_GPU_D3D12=ON,raw_native_cli --gpurenders the whole frame on D3D12 and writes the sameraw-gpu-cert/1certificate against the CPU reference, judged by the bounds committed inraw/gpu_tolerance.hppbefore any GPU code existed. The HLSL is generated from the WGSL byscripts/wgsl_to_hlsl.pyand compiled by DXC with strict IEEE float; CI regenerates it on every push and fails on any difference, so there is one shader source. - Software adapters are refused. The backend takes the first hardware adapter in high-performance order. It skips any adapter flagged as software and the Microsoft Basic Render Driver, which DXGI can list without the software flag. With no hardware adapter,
--gpuexits 4 with anunverifiableGPU certificate naming what it skipped.RAW_NATIVE_D3D12_WARP=1selects WARP on purpose. - superstack receipts. Every render writes
receipt.json(superstack.receipt/1): canonical JSON with a SHA-256 seal, reporting identity (MATCHorDRIFT) and the tolerance verdict separately. A--gpurun addsgpu_receipt.json, comparing the GPU frame's RGB8 bytes with the CPU frame's.raw_native_cli verifyrechecks the seal, every digest, the subject and reference hashes and the verdict. - Additive schema changes.
certificate.json(raw-cert/2) is unchanged byte for byte apart from the version string.gpu_certificate.jsongainsidentity, both frame hashes andadapter.driver;params.backendnow names the build's backend (d3d12,webgpuornone). - The default Windows build and the CPU wasm build still contain no GPU code. There,
--gpuexits 4 with anunverifiablecertificate.
Checked before release
- D3D12 on an RTX 4090: 16 of 16 GPU certificates
verifiedacross three frame sizes and five camera views, with and without the ray-traced pass, plus a moving camera. Coverage agrees on every pixel. The largest channel RMSE is 4.2e-5 against a bound of 0.01; the largest single pixel error is 1/64, one hemisphere ray. The 8-bit GPU frame equals the CPU frame (MATCH) in 13 of 16 renders; the other 3 (DRIFT, stillverified) are ray-traced renders where a few pixels differ by one ray. - WebGPU in headed Chrome 154: the same 16 of 16, with the same identity split and every channel's RMSE and maximum error equal to the D3D12 run. D3D12 and WebGPU agree on all 104 compared summary values; that is equal summaries, not a per-pixel comparison of the two GPU frames.
- WARP: 16 of 16 with RMSE exactly 0 on every channel and every frame byte-identical to the CPU's. WARP is software, so this shows the WGSL to HLSL translation is exact. It is not GPU evidence.
- The released
raw-native-gpu.wasmis byte-identical to the build that produced the WebGPU evidence. - The default render's
certificate.json,frame.ppm,frame_hdr.pfm,channels.jsonand all AO files are byte-identical from the packaged Windows, Windows D3D12, Linux and CPU wasm builds (certificate.jsonSHA-256235ad718...).receipt.jsonis byte-identical across the three native builds. Every file 0.4.0 also wrote hashes the same as in 0.4.0, apart from the certificate's version string. raw_native_cli verifypasses on every packaged build's output, run with the Windows, Windows D3D12 and Linux binaries.- 34 of 34 tests pass with MSVC 19.50 and GCC 13.3. The D3D12 build adds a hardware runtime test, which CI reports as skipped with its reason because the runner has no GPU.
Speed on the RTX 4090
Median of 5 renders after one warm-up, milliseconds. "Every channel" reads back all nine buffers; "frame only" reads back the shaded frame.
| Frame | Mode | D3D12, every channel | D3D12, frame only | WebGPU, every channel | WebGPU, frame only | CPU, one thread |
|---|---|---|---|---|---|---|
| 256 x 256 | Full | 5.6 | 3.9 | 11.7 | 4.9 | 258 |
| 512 x 512 | Full | 12.2 | 5.0 | 34.5 | 8.9 | 1,028 |
| 1440 x 900 | Full | 48.8 | 16.0 | 94.9 | 24.3 | 4,527 |
| 256 x 256 | No RT | 5.0 | 3.1 | 9.0 | 3.0 | 29 |
| 512 x 512 | No RT | 11.5 | 5.3 | 26.7 | 4.9 | 118 |
| 1440 x 900 | No RT | 45.7 | 13.2 | 86.3 | 15.3 | 527 |
Raw runs: evidence/bench-d3d12-rtx4090.json, evidence/d3d12-rtx4090-checks.json, evidence/webgpu-rtx4090-chromium.json, evidence/d3d12-warp-checks.json.
Limits
- One GPU, one driver and one OS measured: an RTX 4090 on NVIDIA 610.88, Windows 11 build 26220. Another adapter or driver may differ in either direction.
- WebGPU timings vary between sessions. The v0.4.0 run on the same machine measured 6.8, 14.3 and 72.7 ms for the full frame with every channel, against 11.7, 34.5 and 94.9 here. Read the WebGPU columns as a range, not a point.
- The wasm build writes no superstack receipt. superstack 0.1.0's header does not compile with libc++, which Emscripten uses, so the wasm build prints
receipt: not writtenandverifyreports the file as absent. This stays until superstack fixes its Emscripten build upstream. The wasm build's certificate and image files are still byte-identical to native. - One built-in scene. Agreement with the CPU is not agreement with ground truth: the CPU reference is itself a 64-sample estimate.
Licensed FSL-1.1-MIT. Version 0.2.0 and earlier stay MIT.
raw-native 0.4.0
raw-native renders a test scene, computes ambient occlusion two ways, and writes a certificate saying whether the fast screen-space estimate held against a ray-traced reference. Version 0.4.0 adds a GPU backend: the whole frame runs on WebGPU, and every GPU frame comes with a second certificate comparing it against the CPU path.
Download and run
| File | Platform |
|---|---|
raw-native-0.4.0-windows-x64.zip |
Windows 10 or 11, x64. Static runtime, no installer. |
raw-native-0.4.0-linux-x64.tar.gz |
Linux x64 with glibc 2.38 or newer. |
raw-native-0.4.0-wasm.zip |
Browser or Node: the CPU build and the WebGPU build. Also published loose. |
sha256sum -c SHA256SUMS
raw_native_cli --out ./out
raw_native_cli verify ./outIn a browser with WebGPU and JSPI (tested in Chrome 154):
const raw = await loadRawNative({ moduleUrl: "raw-native-gpu.mjs", moduleSha256: "<from SHA256SUMS>",
wasmUrl: "raw-native-gpu.wasm", wasmSha256: "<from SHA256SUMS>" });
const run = await raw.renderAsync({ width: 512, height: 512, gpu: true });
run.gpuCertificate.verdict; // "verified" when the GPU frame matches the CPU referenceWhat is new
- A WebGPU backend in WGSL: triangle setup, rasterization with depth, position, normal and coverage, motion vectors, screen-space AO, ray-traced AO and shading, all as compute passes.
--gpurenders on the GPU, renders the CPU reference intocpu/, and writesgpu_certificate.json(raw-gpu-cert/1): coverage agreement, RMSE and maximum error per channel, the frame's own AO verdict against the CPU's, the adapter, both timings, and what the result does not prove.- The bounds live in
raw/gpu_tolerance.hpp, committed before any GPU code and before any GPU output was seen. - The default native build and the CPU wasm build contain no GPU code. There,
--gpuexits 4 with anunverifiablecertificate.
Checked before release
- 16 of 16 GPU certificates
verifiedon an NVIDIA RTX 4090 in headed Chrome 154: three frame sizes and five camera views, with and without the ray-traced pass, plus a moving camera. Coverage agrees on every pixel; the largest channel RMSE is 4.2e-5 against a bound of 0.01. The releasedraw-native-gpu.wasmis byte-identical to the build that produced this evidence. - 32 of 32 tests pass with MSVC 19.50 and GCC 13.3, and in CI on Windows and Ubuntu runners. CI also builds the WebGPU module.
- The default render's
certificate.jsonis byte-identical from the Windows binary, the Linux binary and the CPU wasm build (SHA-256302c4ec9...). It differs from 0.3.0 only in the renderer version string; every output file hashes the same as in 0.3.0.
Speed on the RTX 4090
Median of 5 renders after one warm-up, milliseconds.
| Frame | Mode | WebGPU, every channel read back | WebGPU, frame only | CPU, one thread |
|---|---|---|---|---|
| 256 x 256 | Full | 6.8 | 4.0 | 258 |
| 512 x 512 | Full | 14.3 | 4.4 | 1,028 |
| 1440 x 900 | Full | 72.7 | 17.8 | 4,527 |
| 256 x 256 | No RT | 6.4 | 0.8 | 29 |
| 512 x 512 | No RT | 12.0 | 4.1 | 118 |
| 1440 x 900 | No RT | 64.4 | 17.4 | 527 |
Wall times inside the module, one machine, one browser. Raw runs: evidence/webgpu-rtx4090-chromium.json.
Limits
One built-in scene. One GPU, driver and browser measured. Agreement with the CPU is not agreement with ground truth: the CPU reference is itself a 64-sample estimate. Native D3D12 is not part of this release.
Licensed FSL-1.1-MIT. Version 0.2.0 and earlier stay MIT.
raw-native 0.3.0
raw-native renders a test scene on the CPU, computes ambient occlusion two ways, measures how far the fast screen-space estimate drifts from a ray-traced reference, and writes a JSON certificate with the verdict. Version 0.3.0 makes that certificate checkable from data alone and adds a WebAssembly build that writes the same certificate as the native one.
Download and run
| File | Platform |
|---|---|
raw-native-0.3.0-windows-x64.zip |
Windows 10 or 11, x64. Static runtime, no installer. |
raw-native-0.3.0-linux-x64.tar.gz |
Linux x64 with glibc 2.38 or newer (Ubuntu 24.04, Debian 13). |
raw-native-0.3.0-wasm.zip |
Browser or Node. Also published loose: raw-native.wasm, raw-native.mjs, raw-loader.mjs. |
sha256sum -c SHA256SUMS
raw_native_cli --out ./out
raw_native_cli verify ./out # recompute RMSE and max error from the written filesWhat is new
- Certificate schema
raw-cert/2: the renderer version, the canonical params, the sample counts (64 ray-traced, 24 screen-space) and the SHA-256 of every output file. ao_rt.pfm,ao_ss.pfmandmask.pgm: 32-bit AO buffers and the coverage mask, so a checker can recompute RMSE and maximum error exactly.raw_native_cli verify <dir>andscripts/recheck.pyboth do it.--tolerance, recorded in the certificate.--no-rtfor a raster-only run.--threadsfor a parallel render with identical output.--bench <runs>for timing.- A WebAssembly build and a loader that checks both files against a SHA-256 before running them.
- License: from 0.3.0, raw-native is released under FSL-1.1-MIT. Version 0.2.0 and earlier stay under MIT, as released.
Checked before release
- 31 of 31 tests pass with MSVC 19.50 (Windows) and GCC 13.3 (Ubuntu 24.04), and in CI on GitHub's Windows and Ubuntu runners.
- The default render's
certificate.jsonis byte-identical from the Windows binary, the Linux binary and the wasm build, run from these release files: SHA-256fc9ac76b.... The ten image and data files it names hash the same on all three.arena_certificate.jsondiffers between them, because the standard library's allocation sizes differ by platform; each one readsverified. - At 512 x 512, five camera views, the wasm build's output files hash the same as the native build's. Evidence:
evidence/wasm-vs-native-512.json. - The default view's verdict is
refuted(RMSE 0.1294 against 0.12 at 256 x 256). That is the measurement, not a defect.
Speed
Median of 5 renders in milliseconds, one machine (Intel Core i7-13700KF, Windows 11), wasm in a Worker in Chromium 154. Full raw runs in evidence/bench-*.json.
| Frame | Mode | wasm | wasm SIMD | wasm threads (24) | native | native 24 threads |
|---|---|---|---|---|---|---|
| 256 x 256 | Full | 252 | 298 | 32 | 258 | 241 |
| 512 x 512 | Full | 1,013 | 1,143 | 127 | 1,028 | 293 |
| 1440 x 900 | Full | 4,646 | 4,881 | 523 | 4,527 | 613 |
| 256 x 256 | No RT | 27 | 31 | 5 | 29 | 114 |
| 512 x 512 | No RT | 110 | 116 | 21 | 118 | 119 |
| 1440 x 900 | No RT | 533 | 541 | 85 | 527 | 199 |
The threaded wasm build needs SharedArrayBuffer, which a browser grants only to a page sent with COOP and COEP headers. GitHub Pages cannot send them, so a Pages site can serve the single-threaded build only.
Limits
One built-in test scene and no model loader. The reference is a 64-sample estimate, repeatable but not exact. A pass on RMSE says nothing about the worst pixel. Native threading starts fresh threads per pass, which costs more than it saves at small frames. Byte-identical output is checked on x86-64 hosts only.
raw-native 0.2.0
First public release of raw-native: a dependency-free C++23 CPU renderer that computes ambient occlusion two ways, measures how far the fast screen-space shortcut drifts from a ray-traced reference, and writes a JSON certificate with the verdict.
Download and run
| File | Platform |
|---|---|
raw-native-0.2.0-windows-x64.zip |
Windows 10 or 11, x64. Static runtime, no installer. |
raw-native-0.2.0-linux-x64.tar.gz |
Linux x64 with glibc 2.38 or newer (Ubuntu 24.04, Debian 13). |
sha256sum -c SHA256SUMS
raw_native_cli --out ./out
raw_native_cli --helpWhat is in 0.2.0
- Ray-traced and screen-space ambient occlusion, a reconcile step, and
certificate.jsonwith averifiedorrefutedverdict - A bounded memory arena: the second render pass runs inside exactly the measured budget and
arena_certificate.jsonrecords the result - Camera and frame-size flags, a JSON params file, and a previous camera for motion vectors
- HDR radiance (
frame_hdr.pfm) andchannels.jsonwith coverage, depth, normal, motion, HDR and an 8x8 luminance readout - CMake install rules and a
raw_nativepackage forfind_package
Checked before release
- 29 of 29 tests pass with MSVC 19.50 (Release and Debug) and GCC 13.3 (Ubuntu 24.04), locally and in CI on GitHub's Windows and Ubuntu runners.
- The default render's
frame.ppmandcertificate.jsonhash the same on all four builds:e276f24f...and7a4c6213.... - The default view's verdict is
refuted(RMSE 0.1294 against a tolerance of 0.12 at 256 x 256). The README lists five views and their verdicts.
Limits
One built-in test scene, no model loader, a fixed tolerance in the CLI, single-threaded rendering, and byte-identical output checked on x86-64 only.