Skip to content

Releases

raw-native 0.8.0

Choose a tag to compare

@HarperZ9 HarperZ9 released this 14 Oct 21:07

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 ./out

What 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.hpp and 26 more) are removed. Include raw/<layer>/<name>.hpp. They were due for removal in 0.7.0 and stayed one release longer by mistake.
  • API snapshot 3: two SsrParams defaults changed. api/snapshot-3/MIGRATION.md says 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-soft preset.
  • #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.ppm and both AO files are byte-identical from the packaged Windows, Windows D3D12, Linux and CPU wasm builds (certificate.json SHA-256 4222e191...). raw_native_cli verify passes 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 verified in 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

Choose a tag to compare

@HarperZ9 HarperZ9 released this 12 Oct 17:56
df177d4

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 ./out

What 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.md says how to update.

The full list is in CHANGELOG.md.

Checked before release

  • The default render's certificate.json, receipt.json, channels.json, frame.ppm and both AO files are byte-identical from the packaged Windows, Windows D3D12, Linux and CPU wasm builds (certificate.json SHA-256 c8d08312...). raw_native_cli verify passes 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 verified GPU certificate, and verify passed on it.
  • The packaged viewer rendered raw-hero and raw-hall verified in 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

Choose a tag to compare

@HarperZ9 HarperZ9 released this 09 Oct 04:37
158afa8

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 ./out

What is new

  • Media at every release. raw-native media render turns a repo's docs/media/media.json into 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.ppm and both AO float files are byte-identical from the packaged Windows, Windows D3D12, Linux and CPU wasm builds. The certificate.json SHA-256 is a65bf9b6....
  • Against 0.5.1, frame.ppm, both AO float files and channels.json hash the same. certificate.json and receipt.json differ only through the version string.
  • raw_native_cli verify passes 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 -540p videos are the workflow's renders: captions, no narration. The -1080p and -2160p videos, 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 -1080p and -2160p videos 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 (ffmpeg ebur128). Pictures, facts and captions are unchanged. Each zip's media.json has a sound block, and sound/ 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

Choose a tag to compare

@HarperZ9 HarperZ9 released this 04 Oct 02:11
13c1ba5

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 ./out

What 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 printed receipt: not written. Its receipt is now byte-identical to the receipts from the Windows and Linux builds, and raw_native_cli verify passes on it.
  • superstack 0.2.0, licensed FSL-1.1-MIT. superstack.hpp is copied byte for byte from the superstack v0.2.0 release (SHA-256 a0d223c0567c883b73ed74b19d93cb087e213dc14b950ab0f6f04206cb72c590). The vectors are unchanged. LICENSE-superstack.txt moves 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 -fPIC to 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 wasm warns on any other CMake, and CI installs 4.2.0 and checks the wasm build used it.
  • A changelog. CHANGELOG.md covers 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.pgm and all AO files are byte-identical from the packaged Windows, Windows D3D12, Linux and CPU wasm builds (certificate.json SHA-256 297f744d..., receipt.json a1e5ffbe...).
  • Against 0.5.0, frame.ppm, both AO float files, channels.json and every other image file hash the same. certificate.json differs only in its version string. receipt.json differs in its producer version, the certificate digest and the seal, all following from the version string.
  • raw_native_cli verify passes 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 verified GPU certificate, and verify passed 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.wasm is no longer the build that produced the WebGPU evidence.
  • The WebGPU build's --gpu path was not run for this release. Its CPU render under Node writes the same files as the other builds.
  • arena_certificate.json still differs between platforms, because the standard libraries allocate different sizes. Each reads verified.
  • 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

Choose a tag to compare

@HarperZ9 HarperZ9 released this 04 Oct 01:20
874032c

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 ./out

On 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-gpu

What is new

  • Native D3D12. Built with -DRAW_NATIVE_GPU_D3D12=ON, raw_native_cli --gpu renders the whole frame on D3D12 and writes the same raw-gpu-cert/1 certificate against the CPU reference, judged by the bounds committed in raw/gpu_tolerance.hpp before any GPU code existed. The HLSL is generated from the WGSL by scripts/wgsl_to_hlsl.py and 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, --gpu exits 4 with an unverifiable GPU certificate naming what it skipped. RAW_NATIVE_D3D12_WARP=1 selects WARP on purpose.
  • superstack receipts. Every render writes receipt.json (superstack.receipt/1): canonical JSON with a SHA-256 seal, reporting identity (MATCH or DRIFT) and the tolerance verdict separately. A --gpu run adds gpu_receipt.json, comparing the GPU frame's RGB8 bytes with the CPU frame's. raw_native_cli verify rechecks 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.json gains identity, both frame hashes and adapter.driver; params.backend now names the build's backend (d3d12, webgpu or none).
  • The default Windows build and the CPU wasm build still contain no GPU code. There, --gpu exits 4 with an unverifiable certificate.

Checked before release

  • D3D12 on an RTX 4090: 16 of 16 GPU certificates verified across 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, still verified) 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.wasm is byte-identical to the build that produced the WebGPU evidence.
  • The default render's certificate.json, frame.ppm, frame_hdr.pfm, channels.json and all AO files are byte-identical from the packaged Windows, Windows D3D12, Linux and CPU wasm builds (certificate.json SHA-256 235ad718...). receipt.json is 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 verify passes 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 written and verify reports 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

Choose a tag to compare

@HarperZ9 HarperZ9 released this 03 Oct 22:21
aaebfc7

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 ./out

In 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 reference

What 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.
  • --gpu renders on the GPU, renders the CPU reference into cpu/, and writes gpu_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, --gpu exits 4 with an unverifiable certificate.

Checked before release

  • 16 of 16 GPU certificates verified on 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 released raw-native-gpu.wasm is 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.json is byte-identical from the Windows binary, the Linux binary and the CPU wasm build (SHA-256 302c4ec9...). 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

Choose a tag to compare

@HarperZ9 HarperZ9 released this 03 Oct 21:40
f936cf9

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 files

What 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.pfm and mask.pgm: 32-bit AO buffers and the coverage mask, so a checker can recompute RMSE and maximum error exactly. raw_native_cli verify <dir> and scripts/recheck.py both do it.
  • --tolerance, recorded in the certificate. --no-rt for a raster-only run. --threads for 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.json is byte-identical from the Windows binary, the Linux binary and the wasm build, run from these release files: SHA-256 fc9ac76b.... The ten image and data files it names hash the same on all three. arena_certificate.json differs between them, because the standard library's allocation sizes differ by platform; each one reads verified.
  • 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

Choose a tag to compare

@HarperZ9 HarperZ9 released this 03 Oct 19:11

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 --help

What is in 0.2.0

  • Ray-traced and screen-space ambient occlusion, a reconcile step, and certificate.json with a verified or refuted verdict
  • A bounded memory arena: the second render pass runs inside exactly the measured budget and arena_certificate.json records the result
  • Camera and frame-size flags, a JSON params file, and a previous camera for motion vectors
  • HDR radiance (frame_hdr.pfm) and channels.json with coverage, depth, normal, motion, HDR and an 8x8 luminance readout
  • CMake install rules and a raw_native package for find_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.ppm and certificate.json hash the same on all four builds: e276f24f... and 7a4c6213....
  • 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.