2 pbr_functions::alpha_discard, 3 pbr_fragment::pbr_input_from_standard_material, 4 view_transformations::depth_ndc_to_view_z, 9 prepass_io::{VertexOutput, FragmentOutput}, 10 pbr_deferred_functions::deferred_output, 14 forward_io::{VertexOutput, FragmentOutput}, 16 pbr_functions::{apply_pbr_lighting, main_pass_post_lighting_processing}, 17 pbr_types::STANDARD_MATERIAL_FLAGS_UNLIT_BIT, 21#ifdef MESHLET_MESH_MATERIAL_PASS 22#import bevy_pbr::meshlet_visibility_buffer_resolve::resolve_vertex_output 25#import bevy_water::water_bindings 26#import bevy_water::water_functions as water_fn 30#ifdef MESHLET_MESH_MATERIAL_PASS 31 @builtin(position) frag_coord: vec4<f32>, 34 @builtin(front_facing) is_front: bool, 37#ifdef MESHLET_MESH_MATERIAL_PASS 38 let p_in = resolve_vertex_output(frag_coord); 43 var world_position: vec4<f32> = in.world_position; 44 let w_pos = water_fn::uv_to_coord(in.uv); 46 let height = water_fn::get_wave_height(w_pos); 49 let height_dx = water_fn::get_wave_height(w_pos + vec2<f32>(delta, 0.0)); 50 let height_dz = water_fn::get_wave_height(w_pos + vec2<f32>(0.0, delta)); 51 in.world_normal = normalize(vec3<f32>(height - height_dx, delta, height - height_dz)); 53 let pos = world_position.xyz + (in.world_normal * height); 54 let pos_dx = dpdx(pos); 55 let pos_dy = dpdy(pos); 56 in.world_normal = normalize(cross(pos_dy, pos_dx)); 61#ifdef VISIBILITY_RANGE_DITHER 62 pbr_functions::visibility_range_dither(in.position, in.visibility_range_dither); 66 var pbr_input = pbr_input_from_standard_material(in, is_front); 68 let deep_color = water_bindings::material.deep_color; 69 var water_color = deep_color; 71#ifndef PREPASS_PIPELINE 73 let water_clarity = water_bindings::material.clarity; 74 let shallow_color = water_bindings::material.shallow_color; 75 let edge_scale = water_bindings::material.edge_scale; 76 let edge_color = water_bindings::material.edge_color; 78 let z_depth_buffer_ndc = bevy_pbr::prepass_utils::prepass_depth(in.position, 0u); 79 let z_depth_buffer_view = depth_ndc_to_view_z(z_depth_buffer_ndc); 80 let z_fragment_view = depth_ndc_to_view_z(in.position.z); 81 let depth_diff_view = z_fragment_view - z_depth_buffer_view; 82 let beers_law = exp(-depth_diff_view * water_clarity); 83 let depth_color = vec4<f32>(mix(deep_color.xyz, shallow_color.xyz, beers_law), 1.0 - beers_law); 84 water_color = mix(edge_color, depth_color, smoothstep(0.0, edge_scale, depth_diff_view)); 88 pbr_input.material.base_color *= water_color; 94 pbr_input.material.base_color = alpha_discard(pbr_input.material, pbr_input.material.base_color); 96#ifdef PREPASS_PIPELINE 98 let out = deferred_output(in, pbr_input); 102 var out: FragmentOutput; 103 if (pbr_input.material.flags & STANDARD_MATERIAL_FLAGS_UNLIT_BIT) == 0u { 104 out.color = apply_pbr_lighting(pbr_input); 106 out.color = pbr_input.material.base_color; 111 out.color = main_pass_post_lighting_processing(pbr_input, out.color);