feat(webgpu): HDR post-process primitives — float textures, storage-texture bindings, RESOLVE→HDR target (#27)
Adds the minimal WebGPU-backend surface an HDR bloom/post chain needs: 1. wgpuCreateStorageImage2D + StorageImage2D<>: runtime rgba16float (or other format) textures with STORAGE_BINDING|TEXTURE_BINDING usage, no CompressedTextureAsset upload — GPU-produced HDR targets. 2. UICustomBindingKind::StorageTexture (kind 5): write-only storage-texture binding carrying a texel format (the freed UICustomBinding::format byte), wired through all three binding paths (UI custom / RT / plain compute). Float textures already sample via SampledTexture (sampleType float). 3. PipelineRTWebGPU::Init(..., hdrOutputFormat): RESOLVE writes the linear accumulator into a user rgba16float texture (RTPass::outTexHandle) instead of the rgba8unorm canvas, leaving the composite→swapchain pass to the app. Default RGBA8Unorm keeps the canvas path byte-identical. Existing RT examples updated for the _pad→format field rename; the default paths are unchanged (verified RTStress builds + renders). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
2b266262ee
commit
097cc37347
12 changed files with 198 additions and 22 deletions
|
|
@ -36,6 +36,10 @@ export namespace Crafter {
|
|||
// RTPass to consult when packing the handles[] array at dispatch
|
||||
// time (one resolved u32 handle per binding, in declaration order).
|
||||
std::vector<UICustomBinding> userBindings;
|
||||
// True when Init was given a non-default hdrOutputFormat: RESOLVE
|
||||
// writes a user storage texture instead of the canvas, and RTPass
|
||||
// must supply its handle via RTPass::outTexHandle.
|
||||
bool hdrOutput = false;
|
||||
|
||||
// Build the megakernel pipeline. Groups carry indices into
|
||||
// `sbt.shaders`. The library generates one `case` per registered
|
||||
|
|
@ -45,12 +49,19 @@ export namespace Crafter {
|
|||
// `userBindings` declares extra @group(2)+ resources the user's
|
||||
// closest-hit / miss / raygen WGSL touches (material SSBOs,
|
||||
// albedo textures, samplers).
|
||||
// `hdrOutputFormat` defaults to RGBA8Unorm — the canvas ping-pong
|
||||
// path, unchanged. Pass RGBA16Float (or another float format) to
|
||||
// have RESOLVE write the linear accumulator into a user storage
|
||||
// texture instead, for an HDR post-process chain. The app then owns
|
||||
// the composite→swapchain pass and must set RTPass::outTexHandle.
|
||||
void Init(WebGPUCommandEncoderRef cmd,
|
||||
std::span<const RTShaderGroup> raygenGroups,
|
||||
std::span<const RTShaderGroup> missGroups,
|
||||
std::span<const RTShaderGroup> hitGroups,
|
||||
const ShaderBindingTableWebGPU& sbt,
|
||||
std::span<const UICustomBinding> bindings = {});
|
||||
std::span<const UICustomBinding> bindings = {},
|
||||
WebGPUTexelFormat hdrOutputFormat
|
||||
= WebGPUTexelFormat::RGBA8Unorm);
|
||||
|
||||
PipelineRTWebGPU() = default;
|
||||
PipelineRTWebGPU(const PipelineRTWebGPU&) = delete;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue