35 lines
1.4 KiB
Markdown
35 lines
1.4 KiB
Markdown
|
|
# 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.
|