From aa5c8e6730b03ea901ead59bc7cb1c31dac62012 Mon Sep 17 00:00:00 2001 From: skal Date: Sun, 22 Mar 2026 20:10:53 +0100 Subject: refactor(shaders): extract oct-normal encode/decode into math/normal snippet New src/shaders/math/normal.wgsl: oct_encode, oct_decode, oct_encode_unorm, oct_decode_unorm. Registered in InitShaderComposer as "math/normal". Removed inline copies from gbuf_raster.wgsl and gbuf_pack.wgsl. 18/18 tests passing. --- cnn_v3/shaders/gbuf_raster.wgsl | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) (limited to 'cnn_v3/shaders/gbuf_raster.wgsl') diff --git a/cnn_v3/shaders/gbuf_raster.wgsl b/cnn_v3/shaders/gbuf_raster.wgsl index c762db2..a5eb921 100644 --- a/cnn_v3/shaders/gbuf_raster.wgsl +++ b/cnn_v3/shaders/gbuf_raster.wgsl @@ -3,6 +3,7 @@ // Uses GlobalUniforms, ObjectData, ObjectsBuffer from common_uniforms. #include "common_uniforms" +#include "math/normal" @group(0) @binding(0) var globals: GlobalUniforms; @group(0) @binding(1) var object_data: ObjectsBuffer; @@ -15,20 +16,6 @@ struct VertexOutput { @location(3) @interpolate(flat) instance_index: u32, } -// Octahedral encoding: maps unit normal to [-1,1]^2 -fn oct_encode(n: vec3f) -> vec2f { - let inv_l1 = 1.0 / (abs(n.x) + abs(n.y) + abs(n.z)); - var p = n.xy * inv_l1; - // Fold lower hemisphere - if (n.z < 0.0) { - let s = vec2f( - select(-1.0, 1.0, p.x >= 0.0), - select(-1.0, 1.0, p.y >= 0.0) - ); - p = (1.0 - abs(p.yx)) * s; - } - return p; // in [-1, 1] -} @vertex fn vs_main( @@ -96,7 +83,7 @@ fn fs_main(in: VertexOutput) -> GBufOutput { let mat_id = f32(in.instance_index) / 255.0; // Oct-encode world normal, remap [-1,1] → [0,1] for storage - let oct = oct_encode(normalize(in.world_normal)) * 0.5 + vec2f(0.5); + let oct = oct_encode_unorm(normalize(in.world_normal)); var out: GBufOutput; out.albedo = vec4f(in.color.rgb, 1.0); -- cgit v1.2.3