7const FFT_RESOLUTION: u32 = 256u; 8const LOD_COUNT: u32 = 5u; 19 cascades: array<CascadeParams, 6>, 22 bed_transform: vec4<f32>, 27 cascade_layout: CascadeLayout, 33@group(0) @binding(0) var displacement: texture_2d_array<f32>; 34@group(0) @binding(1) var surface_derivatives: texture_storage_2d_array<rgba16float, write>; 35@group(0) @binding(2) var<uniform> fft: FftUniform; 37@compute @workgroup_size(8, 8, 1) 38fn resolve_surface(@builtin(global_invocation_id) id: vec3<u32>) { 39 if any(id.xy >= vec2<u32>(FFT_RESOLUTION)) || id.z >= LOD_COUNT { 42 let cascade = fft.cascade_layout.cascades[id.z]; 43 let maximum = i32(FFT_RESOLUTION) - 1; 44 let center_coord = vec2<i32>(id.xy); 45 let x_coord = min(center_coord + vec2(1, 0), vec2(maximum)); 46 let z_coord = min(center_coord + vec2(0, 1), vec2(maximum)); 47 let center = textureLoad(displacement, center_coord, i32(id.z), 0).xyz; 48 let offset_x = textureLoad(displacement, x_coord, i32(id.z), 0).xyz; 49 let offset_z = textureLoad(displacement, z_coord, i32(id.z), 0).xyz; 50 let derivative_x = (offset_x - center) / cascade.texel_width; 51 let derivative_z = (offset_z - center) / cascade.texel_width; 52 let determinant = (1.0 + derivative_x.x) * (1.0 + derivative_z.z) 53 - derivative_x.z * derivative_z.x; 54 let tangent_x = vec3(1.0, 0.0, 0.0) + derivative_x; 55 let tangent_z = vec3(0.0, 0.0, 1.0) + derivative_z; 56 let normal_cross = cross(tangent_z, tangent_x); 61 vec4(normal_cross, determinant),