Search across packages, versions, files, declarations, and comments. Use multiple terms to narrow results (AND), and add @vertex, @fragment, or @compute to filter by shader stage.
1#import bevy_pbr::{
2 pbr_prepass_functions,
3 pbr_bindings,
4 pbr_bindings::material,
5 pbr_types,
6 pbr_functions,
7 pbr_functions::SampleBias,
8 prepass_io,
9 mesh_view_bindings::view,
12#ifdef MESHLET_MESH_MATERIAL_PASS
13#import bevy_pbr::meshlet_visibility_buffer_resolve::resolve_vertex_output
14#endif
16#ifdef PREPASS_FRAGMENT
17@fragment
18fn fragment(
19#ifdef MESHLET_MESH_MATERIAL_PASS
20 @builtin(position) frag_coord: vec4<f32>,
21#else
22 in: prepass_io::VertexOutput,
23 @builtin(front_facing) is_front: bool,
24#endif
25) -> prepass_io::FragmentOutput {
26#ifdef MESHLET_MESH_MATERIAL_PASS
27 let in = resolve_vertex_output(frag_coord);
28 let is_front = true;
29#else
30 pbr_prepass_functions::prepass_alpha_discard(in);
31#endif
33 var out: prepass_io::FragmentOutput;
35#ifdef DEPTH_CLAMP_ORTHO
36 out.frag_depth = in.clip_position_unclamped.z;
37#endif // DEPTH_CLAMP_ORTHO
39#ifdef NORMAL_PREPASS
40 // NOTE: Unlit bit not set means == 0 is true, so the true case is if lit
41 if (material.flags & pbr_types::STANDARD_MATERIAL_FLAGS_UNLIT_BIT) == 0u {
42 let double_sided = (material.flags & pbr_types::STANDARD_MATERIAL_FLAGS_DOUBLE_SIDED_BIT) != 0u;
44 let world_normal = pbr_functions::prepare_world_normal(
45 in.world_normal,
46 double_sided,
47 is_front,
48 );
50 var normal = world_normal;
52#ifdef VERTEX_UVS
53#ifdef VERTEX_TANGENTS
54#ifdef STANDARD_MATERIAL_NORMAL_MAP
56// TODO: Transforming UVs mean we need to apply derivative chain rule for meshlet mesh material pass
57#ifdef STANDARD_MATERIAL_NORMAL_MAP_UV_B
58 let uv = (material.uv_transform * vec3(in.uv_b, 1.0)).xy;
59#else
60 let uv = (material.uv_transform * vec3(in.uv, 1.0)).xy;
61#endif
63 // Fill in the sample bias so we can sample from textures.
64 var bias: SampleBias;
65#ifdef MESHLET_MESH_MATERIAL_PASS
66 bias.ddx_uv = in.ddx_uv;
67 bias.ddy_uv = in.ddy_uv;
68#else // MESHLET_MESH_MATERIAL_PASS
69 bias.mip_bias = view.mip_bias;
70#endif // MESHLET_MESH_MATERIAL_PASS
72 let Nt = pbr_functions::sample_texture(
73 pbr_bindings::normal_map_texture,
74 pbr_bindings::normal_map_sampler,
75 uv,
76 bias,
77 ).rgb;
78 let TBN = pbr_functions::calculate_tbn_mikktspace(normal, in.world_tangent);
80 normal = pbr_functions::apply_normal_mapping(
81 material.flags,
82 TBN,
83 double_sided,
84 is_front,
85 Nt,
86 );
88#endif // STANDARD_MATERIAL_NORMAL_MAP
89#endif // VERTEX_TANGENTS
90#endif // VERTEX_UVS
92 out.normal = vec4(normal * 0.5 + vec3(0.5), 1.0);
93 } else {
94 out.normal = vec4(in.world_normal * 0.5 + vec3(0.5), 1.0);
95 }
96#endif // NORMAL_PREPASS
98#ifdef MOTION_VECTOR_PREPASS
99#ifdef MESHLET_MESH_MATERIAL_PASS
100 out.motion_vector = in.motion_vector;
101#else
102 out.motion_vector = pbr_prepass_functions::calculate_motion_vector(in.world_position, in.previous_world_position);
103#endif
104#endif
106 return out;
108#else
109@fragment
110fn fragment(in: prepass_io::VertexOutput) {
111 pbr_prepass_functions::prepass_alpha_discard(in);
113#endif // PREPASS_FRAGMENT
Contents