test(webgpu-rt): RayQueryPick example exercising the rayQuery TLAS shim (#25)
Adds an 8^3 = 512-instance TLAS pick test that shoots one analytically determined ray through a rayQuery=true PlainComputeShader and checks the read-back committed hit (customIndex 484, t 40.75). 512 instances sit in the < 8193 regime that the hardcoded 16384-leaf start used to miss, so the example fails fast if the shim regresses. Verified in Firefox/WebGPU: "[RayQueryPick] PASS". Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
8f6a52a460
commit
b645746c8c
9 changed files with 471 additions and 0 deletions
35
examples/RayQueryPick/README.md
Normal file
35
examples/RayQueryPick/README.md
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
# RayQueryPick
|
||||
|
||||
Regression test for the WebGPU software **ray-query** shim
|
||||
(`additional/dom-webgpu.js`, `_rqTraverseTlas`).
|
||||
|
||||
Builds an 8³ = 512-instance TLAS and shoots one fully-determined ray
|
||||
through a `rayQuery=true` `PlainComputeShader`. The committed hit is read
|
||||
back to the host and checked against the analytically-known answer
|
||||
(instance `customIndex = 484`, `t = 40.75`). On success the console prints:
|
||||
|
||||
```
|
||||
[RayQueryPick] result: hit=1 customIndex=484 prim=6 t=40.75
|
||||
[RayQueryPick] PASS — rayQuery TLAS traversal hit the expected instance
|
||||
```
|
||||
|
||||
## Why 512 instances
|
||||
|
||||
The TLAS sweep tree is padded to `next_pow2(instanceCount)` leaves. The
|
||||
rayQuery shim used to detect BVH leaves with a hardcoded `16384 - 1` leaf
|
||||
start, so for any scene with fewer than 8193 instances **no node index
|
||||
ever reached a leaf** and every pick missed (issue #25). 512 sits squarely
|
||||
in that broken regime, so this example fails fast if the shim regresses to
|
||||
a static leaf start. The shim now derives the leaf start from a per-build
|
||||
`RqTlasMeta.nPadded` uniform, matching the megakernel `_rtwTraverseTlas`.
|
||||
|
||||
The scene also renders through the wavefront RT pipeline (same as
|
||||
RTStress) so the run produces a visible frame, but the pass/fail signal is
|
||||
the console line above.
|
||||
|
||||
```bash
|
||||
cd examples/RayQueryPick
|
||||
crafter-build -r --target=wasm32-wasip1
|
||||
```
|
||||
|
||||
WebGPU/DOM only — the native path uses hardware ray queries.
|
||||
Loading…
Add table
Add a link
Reference in a new issue