test(webgpu): HDRBloom example exercising the HDR post-process primitives (#27)
RT→rgba16float→threshold→blur→composite, end-to-end proof of the three primitives. threshold/blur run from onBeforeUpdate (one submit each) so the storage-write→sampled-read dependency gets WebGPU's per-submit barrier (there is none between dispatches within a compute pass); the composite is a UI custom shader so it owns the canvas ping-pong. Documents the Vulkan symmetry (gap 4): the native present path records passes generically and barriers between them, so the same chain is wireable today. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
097cc37347
commit
bbe1b21c22
10 changed files with 518 additions and 0 deletions
|
|
@ -42,6 +42,16 @@ Accum buffer is linear. Optional user `WebGPURTStage::Resolve` entry
|
|||
`resolve_main(coord:vec2<u32>, hdr:vec4<f32>)->vec4<f32>`. None → passthrough.
|
||||
VulkanTriangle: no resolve (exact match). Sponza: resolve does Reinhard+gamma.
|
||||
|
||||
### HDR output target (issue #27)
|
||||
`PipelineRTWebGPU::Init(..., hdrOutputFormat)` (default `RGBA8Unorm` = the
|
||||
canvas ping-pong path, unchanged) can instead point RESOLVE at a user
|
||||
`rgba16float` storage texture (`RTPass::outTexHandle`). The JS side swaps
|
||||
binding(6)'s WGSL declaration + bind-group-layout format and skips the
|
||||
ping-pong flip, since the canvas is untouched. With no resolve shader the
|
||||
default passthrough writes raw linear radiance — the HDR input an app's own
|
||||
bloom/composite chain (threshold → blur → tonemap → swapchain) reads. See
|
||||
`examples/HDRBloom`.
|
||||
|
||||
## Indirect dispatch (Phase 2 de-risk)
|
||||
Prove `dispatchWorkgroupsIndirect` + cross-pass atomic visibility with a toy
|
||||
"emit N → dispatch N" before wiring real kernels. WebGPU inserts an implicit
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue