1#define_import_path bevy_pbr::pbr_fragment 5 pbr_functions::SampleBias, 11 mesh_view_bindings::view, 12 parallax_mapping::parallaxed_uv, 16#ifdef SCREEN_SPACE_AMBIENT_OCCLUSION 17#import bevy_pbr::mesh_view_bindings::screen_space_ambient_occlusion_texture 18#import bevy_pbr::ssao_utils::ssao_multibounce 21#ifdef MESHLET_MESH_MATERIAL_PASS 22#import bevy_pbr::meshlet_visibility_buffer_resolve::VertexOutput 23#else ifdef PREPASS_PIPELINE 24#import bevy_pbr::prepass_io::VertexOutput 26#import bevy_pbr::forward_io::VertexOutput 30fn pbr_input_from_vertex_output( 34) -> pbr_types::PbrInput { 35 var pbr_input: pbr_types::PbrInput = pbr_types::pbr_input_new(); 37#ifdef MESHLET_MESH_MATERIAL_PASS 38 pbr_input.flags = in.mesh_flags; 40 pbr_input.flags = mesh[in.instance_index].flags; 43 pbr_input.is_orthographic = view.clip_from_view[3].w == 1.0; 44 pbr_input.V = pbr_functions::calculate_view(in.world_position, pbr_input.is_orthographic); 45 pbr_input.frag_coord = in.position; 46 pbr_input.world_position = in.world_position; 49 pbr_input.material.base_color = in.color; 52 pbr_input.world_normal = pbr_functions::prepare_world_normal( 58#ifdef LOAD_PREPASS_NORMALS 59 pbr_input.N = prepass_utils::prepass_normal(in.position, 0u); 61 pbr_input.N = normalize(pbr_input.world_normal); 69fn pbr_input_from_standard_material( 72) -> pbr_types::PbrInput { 73 let double_sided = (pbr_bindings::material.flags & pbr_types::STANDARD_MATERIAL_FLAGS_DOUBLE_SIDED_BIT) != 0u; 75 var pbr_input: pbr_types::PbrInput = pbr_input_from_vertex_output(in, is_front, double_sided); 76 pbr_input.material.flags = pbr_bindings::material.flags; 77 pbr_input.material.base_color *= pbr_bindings::material.base_color; 78 pbr_input.material.deferred_lighting_pass_id = pbr_bindings::material.deferred_lighting_pass_id; 81 let NdotV = max(dot(pbr_input.N, pbr_input.V), 0.0001); 85#ifdef MESHLET_MESH_MATERIAL_PASS 86 bias.ddx_uv = in.ddx_uv; 87 bias.ddy_uv = in.ddy_uv; 88#else // MESHLET_MESH_MATERIAL_PASS 89 bias.mip_bias = view.mip_bias; 90#endif // MESHLET_MESH_MATERIAL_PASS 94 let uv_transform = pbr_bindings::material.uv_transform; 96 var uv = (uv_transform * vec3(in.uv, 1.0)).xy; 101 var uv_b = (uv_transform * vec3(in.uv_b, 1.0)).xy; 106#ifdef VERTEX_TANGENTS 107 if ((pbr_bindings::material.flags & pbr_types::STANDARD_MATERIAL_FLAGS_DEPTH_MAP_BIT) != 0u) { 109 let TBN = pbr_functions::calculate_tbn_mikktspace(in.world_normal, in.world_tangent); 114 let Vt = vec3(dot(V, T), dot(V, B), dot(V, N)); 118 pbr_bindings::material.parallax_depth_scale, 119 pbr_bindings::material.max_parallax_layer_count, 120 pbr_bindings::material.max_relief_mapping_search_steps, 131 uv_b = parallaxed_uv( 132 pbr_bindings::material.parallax_depth_scale, 133 pbr_bindings::material.max_parallax_layer_count, 134 pbr_bindings::material.max_relief_mapping_search_steps, 145#endif // VERTEX_TANGENTS 147 if ((pbr_bindings::material.flags & pbr_types::STANDARD_MATERIAL_FLAGS_BASE_COLOR_TEXTURE_BIT) != 0u) { 148 pbr_input.material.base_color *= pbr_functions::sample_texture( 149 pbr_bindings::base_color_texture, 150 pbr_bindings::base_color_sampler, 151#ifdef STANDARD_MATERIAL_BASE_COLOR_UV_B 159#ifdef ALPHA_TO_COVERAGE 163 let alpha_mode = pbr_bindings::material.flags & 164 pbr_types::STANDARD_MATERIAL_FLAGS_ALPHA_MODE_RESERVED_BITS; 165 if alpha_mode == pbr_types::STANDARD_MATERIAL_FLAGS_ALPHA_MODE_ALPHA_TO_COVERAGE { 166 pbr_input.material.base_color.a = (pbr_input.material.base_color.a - 167 pbr_bindings::material.alpha_cutoff) / 168 max(fwidth(pbr_input.material.base_color.a), 0.0001) + 0.5; 170#endif // ALPHA_TO_COVERAGE 175 pbr_input.material.flags = pbr_bindings::material.flags; 178 if ((pbr_bindings::material.flags & pbr_types::STANDARD_MATERIAL_FLAGS_UNLIT_BIT) == 0u) { 179 pbr_input.material.reflectance = pbr_bindings::material.reflectance; 180 pbr_input.material.ior = pbr_bindings::material.ior; 181 pbr_input.material.attenuation_color = pbr_bindings::material.attenuation_color; 182 pbr_input.material.attenuation_distance = pbr_bindings::material.attenuation_distance; 183 pbr_input.material.alpha_cutoff = pbr_bindings::material.alpha_cutoff; 186 var emissive: vec4<f32> = pbr_bindings::material.emissive; 188 if ((pbr_bindings::material.flags & pbr_types::STANDARD_MATERIAL_FLAGS_EMISSIVE_TEXTURE_BIT) != 0u) { 189 emissive = vec4<f32>(emissive.rgb * pbr_functions::sample_texture( 190 pbr_bindings::emissive_texture, 191 pbr_bindings::emissive_sampler, 192#ifdef STANDARD_MATERIAL_EMISSIVE_UV_B 201 pbr_input.material.emissive = emissive; 204 var metallic: f32 = pbr_bindings::material.metallic; 205 var perceptual_roughness: f32 = pbr_bindings::material.perceptual_roughness; 206 let roughness = lighting::perceptualRoughnessToRoughness(perceptual_roughness); 208 if ((pbr_bindings::material.flags & pbr_types::STANDARD_MATERIAL_FLAGS_METALLIC_ROUGHNESS_TEXTURE_BIT) != 0u) { 209 let metallic_roughness = pbr_functions::sample_texture( 210 pbr_bindings::metallic_roughness_texture, 211 pbr_bindings::metallic_roughness_sampler, 212#ifdef STANDARD_MATERIAL_METALLIC_ROUGHNESS_UV_B 220 metallic *= metallic_roughness.b; 221 perceptual_roughness *= metallic_roughness.g; 224 pbr_input.material.metallic = metallic; 225 pbr_input.material.perceptual_roughness = perceptual_roughness; 228 pbr_input.material.clearcoat = pbr_bindings::material.clearcoat; 230#ifdef PBR_MULTI_LAYER_MATERIAL_TEXTURES_SUPPORTED 231 if ((pbr_bindings::material.flags & pbr_types::STANDARD_MATERIAL_FLAGS_CLEARCOAT_TEXTURE_BIT) != 0u) { 232 pbr_input.material.clearcoat *= pbr_functions::sample_texture( 233 pbr_bindings::clearcoat_texture, 234 pbr_bindings::clearcoat_sampler, 235#ifdef STANDARD_MATERIAL_CLEARCOAT_UV_B 243#endif // PBR_MULTI_LAYER_MATERIAL_TEXTURES_SUPPORTED 247 pbr_input.material.clearcoat_perceptual_roughness = pbr_bindings::material.clearcoat_perceptual_roughness; 249#ifdef PBR_MULTI_LAYER_MATERIAL_TEXTURES_SUPPORTED 250 if ((pbr_bindings::material.flags & pbr_types::STANDARD_MATERIAL_FLAGS_CLEARCOAT_ROUGHNESS_TEXTURE_BIT) != 0u) { 251 pbr_input.material.clearcoat_perceptual_roughness *= pbr_functions::sample_texture( 252 pbr_bindings::clearcoat_roughness_texture, 253 pbr_bindings::clearcoat_roughness_sampler, 254#ifdef STANDARD_MATERIAL_CLEARCOAT_ROUGHNESS_UV_B 262#endif // PBR_MULTI_LAYER_MATERIAL_TEXTURES_SUPPORTED 265 var specular_transmission: f32 = pbr_bindings::material.specular_transmission; 267#ifdef PBR_TRANSMISSION_TEXTURES_SUPPORTED 268 if ((pbr_bindings::material.flags & pbr_types::STANDARD_MATERIAL_FLAGS_SPECULAR_TRANSMISSION_TEXTURE_BIT) != 0u) { 269 specular_transmission *= pbr_functions::sample_texture( 270 pbr_bindings::specular_transmission_texture, 271 pbr_bindings::specular_transmission_sampler, 272#ifdef STANDARD_MATERIAL_SPECULAR_TRANSMISSION_UV_B 282 pbr_input.material.specular_transmission = specular_transmission; 284 var thickness: f32 = pbr_bindings::material.thickness; 286#ifdef PBR_TRANSMISSION_TEXTURES_SUPPORTED 287 if ((pbr_bindings::material.flags & pbr_types::STANDARD_MATERIAL_FLAGS_THICKNESS_TEXTURE_BIT) != 0u) { 288 thickness *= pbr_functions::sample_texture( 289 pbr_bindings::thickness_texture, 290 pbr_bindings::thickness_sampler, 291#ifdef STANDARD_MATERIAL_THICKNESS_UV_B 303#ifndef MESHLET_MESH_MATERIAL_PASS 305 (transpose(mesh[in.instance_index].world_from_local) * vec4(pbr_input.N, 0.0)).xyz 308 pbr_input.material.thickness = thickness; 310 var diffuse_transmission = pbr_bindings::material.diffuse_transmission; 312#ifdef PBR_TRANSMISSION_TEXTURES_SUPPORTED 313 if ((pbr_bindings::material.flags & pbr_types::STANDARD_MATERIAL_FLAGS_DIFFUSE_TRANSMISSION_TEXTURE_BIT) != 0u) { 314 diffuse_transmission *= pbr_functions::sample_texture( 315 pbr_bindings::diffuse_transmission_texture, 316 pbr_bindings::diffuse_transmission_sampler, 317#ifdef STANDARD_MATERIAL_DIFFUSE_TRANSMISSION_UV_B 327 pbr_input.material.diffuse_transmission = diffuse_transmission; 329 var diffuse_occlusion: vec3<f32> = vec3(1.0); 330 var specular_occlusion: f32 = 1.0; 332 if ((pbr_bindings::material.flags & pbr_types::STANDARD_MATERIAL_FLAGS_OCCLUSION_TEXTURE_BIT) != 0u) { 333 diffuse_occlusion *= pbr_functions::sample_texture( 334 pbr_bindings::occlusion_texture, 335 pbr_bindings::occlusion_sampler, 336#ifdef STANDARD_MATERIAL_OCCLUSION_UV_B 345#ifdef SCREEN_SPACE_AMBIENT_OCCLUSION 346 let ssao = textureLoad(screen_space_ambient_occlusion_texture, vec2<i32>(in.position.xy), 0i).r; 347 let ssao_multibounce = ssao_multibounce(ssao, pbr_input.material.base_color.rgb); 348 diffuse_occlusion = min(diffuse_occlusion, ssao_multibounce); 351 specular_occlusion = saturate(pow(NdotV + ssao, exp2(-16.0 * roughness - 1.0)) - 1.0 + ssao); 353 pbr_input.diffuse_occlusion = diffuse_occlusion; 354 pbr_input.specular_occlusion = specular_occlusion; 357#ifndef LOAD_PREPASS_NORMALS 359 pbr_input.N = normalize(pbr_input.world_normal); 360 pbr_input.clearcoat_N = pbr_input.N; 363#ifdef VERTEX_TANGENTS 365 let TBN = pbr_functions::calculate_tbn_mikktspace(pbr_input.world_normal, in.world_tangent); 367#ifdef STANDARD_MATERIAL_NORMAL_MAP 369 let Nt = pbr_functions::sample_texture( 370 pbr_bindings::normal_map_texture, 371 pbr_bindings::normal_map_sampler, 372#ifdef STANDARD_MATERIAL_NORMAL_MAP_UV_B 380 pbr_input.N = pbr_functions::apply_normal_mapping( 381 pbr_bindings::material.flags, 388#endif // STANDARD_MATERIAL_NORMAL_MAP 390#ifdef STANDARD_MATERIAL_CLEARCOAT 396#ifdef STANDARD_MATERIAL_CLEARCOAT_NORMAL_MAP 398 let clearcoat_Nt = pbr_functions::sample_texture( 399 pbr_bindings::clearcoat_normal_texture, 400 pbr_bindings::clearcoat_normal_sampler, 401#ifdef STANDARD_MATERIAL_CLEARCOAT_NORMAL_UV_B 409 pbr_input.clearcoat_N = pbr_functions::apply_normal_mapping( 410 pbr_bindings::material.flags, 417#endif // STANDARD_MATERIAL_CLEARCOAT_NORMAL_MAP 419#endif // STANDARD_MATERIAL_CLEARCOAT 421#endif // VERTEX_TANGENTS 428#ifdef PBR_ANISOTROPY_TEXTURE_SUPPORTED 429#ifdef VERTEX_TANGENTS 430#ifdef STANDARD_MATERIAL_ANISOTROPY 432 var anisotropy_strength = pbr_bindings::material.anisotropy_strength; 433 var anisotropy_direction = pbr_bindings::material.anisotropy_rotation; 436 if ((pbr_bindings::material.flags & pbr_types::STANDARD_MATERIAL_FLAGS_ANISOTROPY_TEXTURE_BIT) != 0u) { 437 let anisotropy_texel = pbr_functions::sample_texture( 438 pbr_bindings::anisotropy_texture, 439 pbr_bindings::anisotropy_sampler, 440#ifdef STANDARD_MATERIAL_ANISOTROPY_UV_B 442#else // STANDARD_MATERIAL_ANISOTROPY_UV_B 444#endif // STANDARD_MATERIAL_ANISOTROPY_UV_B 448 let anisotropy_direction_from_texture = normalize(anisotropy_texel.rg * 2.0 - 1.0); 450 anisotropy_direction = 451 mat2x2(anisotropy_direction.xy, anisotropy_direction.yx * vec2(-1.0, 1.0)) * 452 anisotropy_direction_from_texture; 453 anisotropy_strength *= anisotropy_texel.b; 456 pbr_input.anisotropy_strength = anisotropy_strength; 458 let anisotropy_T = normalize(TBN * vec3(anisotropy_direction, 0.0)); 459 let anisotropy_B = normalize(cross(pbr_input.world_normal, anisotropy_T)); 460 pbr_input.anisotropy_T = anisotropy_T; 461 pbr_input.anisotropy_B = anisotropy_B; 463#endif // STANDARD_MATERIAL_ANISOTROPY 464#endif // VERTEX_TANGENTS 465#endif // PBR_ANISOTROPY_TEXTURE_SUPPORTED 467#endif // LOAD_PREPASS_NORMALS 471 pbr_input.lightmap_light = lightmap( 473 pbr_bindings::material.lightmap_exposure,