7 pbr_deferred_functions::deferred_output, 8 pbr_fragment::pbr_input_from_standard_material, 9 prepass_io::{VertexOutput, FragmentOutput}, 11#import bevy_render::globals::Globals 17 octave_vectors: array<vec4<f32>, 2>, 19 octave_scales: vec4<f32>, 21 octave_strengths: vec4<f32>, 24@group(0) @binding(1) var<uniform> globals: Globals; 26@group(2) @binding(100) var water_normals_texture: texture_2d<f32>; 27@group(2) @binding(101) var water_normals_sampler: sampler; 28@group(2) @binding(102) var<uniform> water_settings: WaterSettings; 31fn sample_noise_octave(uv: vec2<f32>, strength: f32) -> vec3<f32> { 32 let N = textureSample(water_normals_texture, water_normals_sampler, uv).rbg * 2.0 - 1.0; 34 return normalize(mix(vec3(0.0, 1.0, 0.0), N, strength)); 38fn sample_noise(uv: vec2<f32>, time: f32) -> vec3<f32> { 39 let uv0 = uv * water_settings.octave_scales[0] + water_settings.octave_vectors[0].xy * time; 40 let uv1 = uv * water_settings.octave_scales[1] + water_settings.octave_vectors[0].zw * time; 41 let uv2 = uv * water_settings.octave_scales[2] + water_settings.octave_vectors[1].xy * time; 42 let uv3 = uv * water_settings.octave_scales[3] + water_settings.octave_vectors[1].zw * time; 44 sample_noise_octave(uv0, water_settings.octave_strengths[0]) + 45 sample_noise_octave(uv1, water_settings.octave_strengths[1]) + 46 sample_noise_octave(uv2, water_settings.octave_strengths[2]) + 47 sample_noise_octave(uv3, water_settings.octave_strengths[3]) 52fn fragment(in: VertexOutput, @builtin(front_facing) is_front: bool) -> FragmentOutput { 54 var pbr_input = pbr_input_from_standard_material(in, is_front); 56 pbr_input.N = sample_noise(in.uv, globals.time); 58 return deferred_output(in, pbr_input);