From 9bf9b0aa0573f77bd667e6976a8bb413153daa1d Mon Sep 17 00:00:00 2001 From: skal Date: Sun, 22 Mar 2026 19:58:04 +0100 Subject: feat(cnn_v3): GBufDeferredEffect — simple deferred render (albedo * shadow) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New effect unpacks feat_tex0/feat_tex1 and outputs albedo * shadow. Replaces CNNv3Effect in cnn_v3_test sequence until training is complete. 37/37 tests passing. handoff(Gemini): GBufDeferredEffect wired in timeline; CNN v3 pipeline: GBufferEffect → GBufDeferredEffect → sink. --- cnn_v3/shaders/gbuf_deferred.wgsl | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 cnn_v3/shaders/gbuf_deferred.wgsl (limited to 'cnn_v3/shaders/gbuf_deferred.wgsl') diff --git a/cnn_v3/shaders/gbuf_deferred.wgsl b/cnn_v3/shaders/gbuf_deferred.wgsl new file mode 100644 index 0000000..959ab60 --- /dev/null +++ b/cnn_v3/shaders/gbuf_deferred.wgsl @@ -0,0 +1,39 @@ +// G-buffer deferred render — albedo * shadow +// Reads feat_tex0 (rgba32uint, f16 geometric) and feat_tex1 (rgba32uint, u8 context). +// Unpacks albedo and shadow and outputs albedo * shadow. + +@group(0) @binding(0) var feat_tex0: texture_2d; +@group(0) @binding(1) var feat_tex1: texture_2d; +@group(0) @binding(2) var uniforms: GBufDeferredUniforms; + +struct GBufDeferredUniforms { + resolution: vec2f, +} + +@vertex +fn vs_main(@builtin(vertex_index) vid: u32) -> @builtin(position) vec4f { + let x = f32((vid & 1u) << 2u) - 1.0; + let y = f32((vid & 2u) << 1u) - 1.0; + return vec4f(x, y, 0.0, 1.0); +} + +@fragment +fn fs_main(@builtin(position) pos: vec4f) -> @location(0) vec4f { + let coord = vec2i(pos.xy); + + // feat_tex0 layout: + // [0] pack2x16float(albedo.r, albedo.g) + // [1] pack2x16float(albedo.b, normal.x) + let t0 = textureLoad(feat_tex0, coord, 0); + let rg = unpack2x16float(t0.x); + let bx = unpack2x16float(t0.y); + let albedo = vec3f(rg.x, rg.y, bx.x); + + // feat_tex1 layout: + // [2] pack4x8unorm(mip2.g, mip2.b, shadow, transp) + let t1 = textureLoad(feat_tex1, coord, 0); + let ctx2 = unpack4x8unorm(t1.z); + let shadow = ctx2.z; // shadow is the third byte + + return vec4f(albedo * shadow, 1.0); +} -- cgit v1.2.3