summaryrefslogtreecommitdiff
path: root/cnn_v3/shaders/gbuf_deferred.wgsl
blob: fffe5b9bd2b11996703ae34494db8015df09366a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// G-buffer deferred render — albedo * diffuse
// Reads feat_tex0 (rgba32uint, f16 geometric).
// Outputs albedo * (ambient + diffuse).

#include "math/normal"

@group(0) @binding(0) var feat_tex0: texture_2d<u32>;
@group(0) @binding(1) var feat_tex1: texture_2d<u32>;
@group(0) @binding(2) var<uniform> uniforms: GBufDeferredUniforms;

struct GBufDeferredUniforms {
    resolution: vec2f,
}

const KEY_LIGHT: vec3f = vec3f(0.408, 0.816, 0.408);  // normalize(1,2,1)
const AMBIENT:   f32   = 0.15;

@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)   oct [-1,1]
    //   [2] pack2x16float(normal.y, depth)       oct [-1,1]
    let t0     = textureLoad(feat_tex0, coord, 0);
    let rg     = unpack2x16float(t0.x);
    let bx     = unpack2x16float(t0.y);
    let ny_d   = unpack2x16float(t0.z);
    let albedo = vec3f(rg.x, rg.y, bx.x);

    // Decode oct-normal (stored in [-1,1] — use oct_decode directly)
    let normal  = oct_decode(vec2f(bx.y, ny_d.x));
    let diffuse = max(0.0, dot(normal, KEY_LIGHT));

    return vec4f(albedo * (AMBIENT + diffuse), 1.0);
}