Crafter.Graphics/examples/RTVolume/README.md
catbot 40c4184d41 test(vulkan-rt): port RTVolume example to native Vulkan (#33)
Regression test for the procedural BLAS path: the same 3x3x3 grid of
unit-box AABBs runs through a PROCEDURAL_HIT_GROUP_KHR group whose GLSL
intersection shader (reportIntersectionEXT) turns each box into a
radius-1 sphere, the any-hit shader punches the spherical-checkerboard
cut-out (visible proof non-opaque geometry runs any-hit), and the
closest-hit shades per-instance tints — the WebGPU example behavior
reproduced natively. Fixed camera in raygen.glsl; the WebGPU/DOM path is
unchanged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 00:17:37 +00:00

36 lines
1.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# RTVolume
Ray tracing of **procedural (AABB) geometry** with an **any-hit** cut-out
on both backends — software WebGPU (issue #13) and native Vulkan hardware
RT (issue #33).
A 3×3×3 grid of unit boxes is registered as an AABB BLAS
(`Mesh::BuildProcedural``VK_GEOMETRY_TYPE_AABBS_KHR` on Vulkan, the
software AABB-leaf path on WebGPU). The hit group is procedural
(`RTShaderGroupType::ProceduralHitGroup` /
`VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR`) carrying:
- `intersection.wgsl` / `intersection.glsl` — analytic raysphere test that
turns each box into a radius-1 sphere (runs once per box the ray enters);
- `anyhit.wgsl` / `anyhit.glsl` — ignores the intersection for half the
cells of a spherical checkerboard, so the ray passes through and the
background / spheres behind show through (the visible proof any-hit runs);
- `closesthit.wgsl` / `closesthit.glsl` — normal-based Lambert shading,
tinted per instance.
The geometry is registered **non-opaque** and the instances clear their
force-opaque flag, which is what lets the any-hit shader run. Flip the
instance flag to `kRTGeometryInstanceForceOpaque` (or build the mesh with
`opaque = true`) to skip any-hit and see solid spheres.
WebGPU/DOM (free camera, WASD + mouse):
```
crafter-build --target=wasm32-wasip1 -r
```
Native Vulkan (fixed camera in raygen.glsl):
```
crafter-build -r
```