//SPDX-License-Identifier: MIT //SPDX-FileCopyrightText: Copyright (C) 2026 Catcrafts® // HDRBloom threshold pass (PlainComputeShader). Reads the linear HDR scene // (rgba16float, written by the RT RESOLVE stage), keeps only the radiance // above 1.0, and writes it into the bloom mip (also rgba16float). This is // the primitive the issue asks for: sample a float texture (group 1 // binding 0) and WRITE a user-owned float storage texture (group 1 // binding 1) at an app-chosen binding. // // Layout (PlainComputeShader, no rayQuery → user groups start at 1): // @group(0) @binding(0) uniform Dim (surface size) // @group(1) @binding(0) texture_2d src (sampled, float) // @group(1) @binding(1) storage rgba16float dst (write) struct Dim { w: u32, h: u32, _0: u32, _1: u32 }; @group(0) @binding(0) var dim : Dim; @group(1) @binding(0) var src : texture_2d; @group(1) @binding(1) var dst : texture_storage_2d; @compute @workgroup_size(8, 8, 1) fn main(@builtin(global_invocation_id) gid: vec3) { if (gid.x >= dim.w || gid.y >= dim.h) { return; } let coord = vec2(i32(gid.x), i32(gid.y)); let c = textureLoad(src, coord, 0).rgb; // Soft knee around 1.0 so the extracted highlights ramp in smoothly. let lum = dot(c, vec3(0.2126, 0.7152, 0.0722)); let keep = max(0.0, lum - 1.0) / max(lum, 1e-4); textureStore(dst, coord, vec4(c * keep, 1.0)); }