diff options
| author | skal <pascal.massimino@gmail.com> | 2026-03-22 20:10:53 +0100 |
|---|---|---|
| committer | skal <pascal.massimino@gmail.com> | 2026-03-22 20:10:53 +0100 |
| commit | aa5c8e6730b03ea901ead59bc7cb1c31dac62012 (patch) | |
| tree | 989378b4eeeaa568e437b9f5cc0b7c5a96e23e79 /cnn_v3/shaders/gbuf_raster.wgsl | |
| parent | 9bf9b0aa0573f77bd667e6976a8bb413153daa1d (diff) | |
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.
Diffstat (limited to 'cnn_v3/shaders/gbuf_raster.wgsl')
| -rw-r--r-- | cnn_v3/shaders/gbuf_raster.wgsl | 17 |
1 files changed, 2 insertions, 15 deletions
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<uniform> globals: GlobalUniforms; @group(0) @binding(1) var<storage, read> 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); |
