1#define_import_path bevy_pbr::pbr_fragment 3#import bevy_render::bindless::{bindless_samplers_filtering, bindless_textures_2d} 7 pbr_functions::SampleBias, 13 mesh_view_bindings::view, 14 parallax_mapping::parallaxed_uv, 18#ifdef SCREEN_SPACE_AMBIENT_OCCLUSION 19#import bevy_pbr::mesh_view_bindings::screen_space_ambient_occlusion_texture 20#import bevy_pbr::ssao_utils::ssao_multibounce 23#ifdef MESHLET_MESH_MATERIAL_PASS 24#import bevy_pbr::meshlet_visibility_buffer_resolve::VertexOutput 25#else ifdef PREPASS_PIPELINE 26#import bevy_pbr::prepass_io::VertexOutput 28#import bevy_pbr::forward_io::VertexOutput 32#import bevy_pbr::pbr_bindings::material_indices 36fn pbr_input_from_vertex_output( 40) -> pbr_types::PbrInput { 41 var pbr_input: pbr_types::PbrInput = pbr_types::pbr_input_new(); 43#ifdef MESHLET_MESH_MATERIAL_PASS 44 pbr_input.flags = in.mesh_flags; 46 pbr_input.flags = mesh[in.instance_index].flags; 49 pbr_input.is_orthographic = view.clip_from_view[3].w == 1.0; 50 pbr_input.V = pbr_functions::calculate_view(in.world_position, pbr_input.is_orthographic); 51 pbr_input.frag_coord = in.position; 52 pbr_input.world_position = in.world_position; 55 pbr_input.material.base_color = in.color; 58 pbr_input.world_normal = pbr_functions::prepare_world_normal( 64#ifdef LOAD_PREPASS_NORMALS 65 pbr_input.N = prepass_utils::prepass_normal(in.position, 0u); 67 pbr_input.N = normalize(pbr_input.world_normal); 75fn pbr_input_from_standard_material( 78) -> pbr_types::PbrInput { 79#ifdef MESHLET_MESH_MATERIAL_PASS 80 let slot = in.material_bind_group_slot; 81#else // MESHLET_MESH_MATERIAL_PASS 82 let slot = mesh[in.instance_index].material_and_lightmap_bind_group_slot & 0xffffu; 83#endif // MESHLET_MESH_MATERIAL_PASS 85 let flags = pbr_bindings::material_array[material_indices[slot].material].flags; 86 let base_color = pbr_bindings::material_array[material_indices[slot].material].base_color; 87 let deferred_lighting_pass_id = 88 pbr_bindings::material_array[material_indices[slot].material].deferred_lighting_pass_id; 90 let flags = pbr_bindings::material.flags; 91 let base_color = pbr_bindings::material.base_color; 92 let deferred_lighting_pass_id = pbr_bindings::material.deferred_lighting_pass_id; 95 let double_sided = (flags & pbr_types::STANDARD_MATERIAL_FLAGS_DOUBLE_SIDED_BIT) != 0u; 97 var pbr_input: pbr_types::PbrInput = pbr_input_from_vertex_output(in, is_front, double_sided); 98 pbr_input.material.flags = flags; 99 pbr_input.material.base_color *= base_color; 100 pbr_input.material.deferred_lighting_pass_id = deferred_lighting_pass_id; 103 let NdotV = max(dot(pbr_input.N, pbr_input.V), 0.0001); 106 var bias: SampleBias; 107#ifdef MESHLET_MESH_MATERIAL_PASS 108 bias.ddx_uv = in.ddx_uv; 109 bias.ddy_uv = in.ddy_uv; 110#else // MESHLET_MESH_MATERIAL_PASS 111 bias.mip_bias = view.mip_bias; 112#endif // MESHLET_MESH_MATERIAL_PASS 118 let uv_transform = pbr_bindings::material_array[material_indices[slot].material].uv_transform; 120 let uv_transform = pbr_bindings::material.uv_transform; 124 var uv = (uv_transform * vec3(in.uv, 1.0)).xy; 129 var uv_b = (uv_transform * vec3(in.uv_b, 1.0)).xy; 134#ifdef VERTEX_TANGENTS 135 if ((flags & pbr_types::STANDARD_MATERIAL_FLAGS_DEPTH_MAP_BIT) != 0u) { 137 let TBN = pbr_functions::calculate_tbn_mikktspace(in.world_normal, in.world_tangent); 142 let Vt = vec3(dot(V, T), dot(V, B), dot(V, N)); 147 pbr_bindings::material_array[material_indices[slot].material].parallax_depth_scale, 148 pbr_bindings::material_array[material_indices[slot].material].max_parallax_layer_count, 149 pbr_bindings::material_array[material_indices[slot].material].max_relief_mapping_search_steps, 151 pbr_bindings::material.parallax_depth_scale, 152 pbr_bindings::material.max_parallax_layer_count, 153 pbr_bindings::material.max_relief_mapping_search_steps, 166 uv_b = parallaxed_uv( 168 pbr_bindings::material_array[material_indices[slot].material].parallax_depth_scale, 169 pbr_bindings::material_array[material_indices[slot].material].max_parallax_layer_count, 170 pbr_bindings::material_array[material_indices[slot].material].max_relief_mapping_search_steps, 172 pbr_bindings::material.parallax_depth_scale, 173 pbr_bindings::material.max_parallax_layer_count, 174 pbr_bindings::material.max_relief_mapping_search_steps, 187#endif // VERTEX_TANGENTS 189 if ((flags & pbr_types::STANDARD_MATERIAL_FLAGS_BASE_COLOR_TEXTURE_BIT) != 0u) { 190 pbr_input.material.base_color *= 191#ifdef MESHLET_MESH_MATERIAL_PASS 193#else // MESHLET_MESH_MATERIAL_PASS 195#endif // MESHLET_MESH_MATERIAL_PASS 197 bindless_textures_2d[material_indices[slot].base_color_texture], 198 bindless_samplers_filtering[material_indices[slot].base_color_sampler], 200 pbr_bindings::base_color_texture, 201 pbr_bindings::base_color_sampler, 203#ifdef STANDARD_MATERIAL_BASE_COLOR_UV_B 208#ifdef MESHLET_MESH_MATERIAL_PASS 211#else // MESHLET_MESH_MATERIAL_PASS 213#endif // MESHLET_MESH_MATERIAL_PASS 216#ifdef ALPHA_TO_COVERAGE 220 let alpha_mode = flags & pbr_types::STANDARD_MATERIAL_FLAGS_ALPHA_MODE_RESERVED_BITS; 221 if alpha_mode == pbr_types::STANDARD_MATERIAL_FLAGS_ALPHA_MODE_ALPHA_TO_COVERAGE { 224 let alpha_cutoff = pbr_bindings::material_array[material_indices[slot].material].alpha_cutoff; 226 let alpha_cutoff = pbr_bindings::material.alpha_cutoff; 229 pbr_input.material.base_color.a = (pbr_input.material.base_color.a - alpha_cutoff) / 230 max(fwidth(pbr_input.material.base_color.a), 0.0001) + 0.5; 232#endif // ALPHA_TO_COVERAGE 237 pbr_input.material.flags = flags; 240 if ((flags & pbr_types::STANDARD_MATERIAL_FLAGS_UNLIT_BIT) == 0u) { 242 pbr_input.material.ior = pbr_bindings::material_array[material_indices[slot].material].ior; 243 pbr_input.material.attenuation_color = 244 pbr_bindings::material_array[material_indices[slot].material].attenuation_color; 245 pbr_input.material.attenuation_distance = 246 pbr_bindings::material_array[material_indices[slot].material].attenuation_distance; 247 pbr_input.material.alpha_cutoff = 248 pbr_bindings::material_array[material_indices[slot].material].alpha_cutoff; 250 pbr_input.material.ior = pbr_bindings::material.ior; 251 pbr_input.material.attenuation_color = pbr_bindings::material.attenuation_color; 252 pbr_input.material.attenuation_distance = pbr_bindings::material.attenuation_distance; 253 pbr_input.material.alpha_cutoff = pbr_bindings::material.alpha_cutoff; 258 pbr_input.material.reflectance = 259 pbr_bindings::material_array[material_indices[slot].material].reflectance; 261 pbr_input.material.reflectance = pbr_bindings::material.reflectance; 264#ifdef PBR_SPECULAR_TEXTURES_SUPPORTED 268 if ((flags & pbr_types::STANDARD_MATERIAL_FLAGS_SPECULAR_TEXTURE_BIT) != 0u) { 270#ifdef MESHLET_MESH_MATERIAL_PASS 272#else // MESHLET_MESH_MATERIAL_PASS 274#endif // MESHLET_MESH_MATERIAL_PASS 276 bindless_textures_2d[material_indices[slot].specular_texture], 277 bindless_samplers_filtering[material_indices[slot].specular_sampler], 279 pbr_bindings::specular_texture, 280 pbr_bindings::specular_sampler, 282#ifdef STANDARD_MATERIAL_SPECULAR_UV_B 284#else // STANDARD_MATERIAL_SPECULAR_UV_B 286#endif // STANDARD_MATERIAL_SPECULAR_UV_B 287#ifdef MESHLET_MESH_MATERIAL_PASS 290#else // MESHLET_MESH_MATERIAL_PASS 292#endif // MESHLET_MESH_MATERIAL_PASS 296 pbr_input.material.reflectance *= specular * 0.5; 300 if ((flags & pbr_types::STANDARD_MATERIAL_FLAGS_SPECULAR_TINT_TEXTURE_BIT) != 0u) { 302#ifdef MESHLET_MESH_MATERIAL_PASS 304#else // MESHLET_MESH_MATERIAL_PASS 306#endif // MESHLET_MESH_MATERIAL_PASS 308 bindless_textures_2d[material_indices[slot].specular_tint_texture], 309 bindless_samplers_filtering[material_indices[slot].specular_tint_sampler], 311 pbr_bindings::specular_tint_texture, 312 pbr_bindings::specular_tint_sampler, 314#ifdef STANDARD_MATERIAL_SPECULAR_TINT_UV_B 316#else // STANDARD_MATERIAL_SPECULAR_TINT_UV_B 318#endif // STANDARD_MATERIAL_SPECULAR_TINT_UV_B 319#ifdef MESHLET_MESH_MATERIAL_PASS 322#else // MESHLET_MESH_MATERIAL_PASS 324#endif // MESHLET_MESH_MATERIAL_PASS 326 pbr_input.material.reflectance *= specular_tint; 330#endif // PBR_SPECULAR_TEXTURES_SUPPORTED 334 var emissive: vec4<f32> = pbr_bindings::material_array[material_indices[slot].material].emissive; 336 var emissive: vec4<f32> = pbr_bindings::material.emissive; 340 if ((flags & pbr_types::STANDARD_MATERIAL_FLAGS_EMISSIVE_TEXTURE_BIT) != 0u) { 341 emissive = vec4<f32>(emissive.rgb * 342#ifdef MESHLET_MESH_MATERIAL_PASS 344#else // MESHLET_MESH_MATERIAL_PASS 346#endif // MESHLET_MESH_MATERIAL_PASS 348 bindless_textures_2d[material_indices[slot].emissive_texture], 349 bindless_samplers_filtering[material_indices[slot].emissive_sampler], 351 pbr_bindings::emissive_texture, 352 pbr_bindings::emissive_sampler, 354#ifdef STANDARD_MATERIAL_EMISSIVE_UV_B 359#ifdef MESHLET_MESH_MATERIAL_PASS 362#else // MESHLET_MESH_MATERIAL_PASS 364#endif // MESHLET_MESH_MATERIAL_PASS 369 pbr_input.material.emissive = emissive; 373 var metallic: f32 = pbr_bindings::material_array[material_indices[slot].material].metallic; 374 var perceptual_roughness: f32 = pbr_bindings::material_array[material_indices[slot].material].perceptual_roughness; 376 var metallic: f32 = pbr_bindings::material.metallic; 377 var perceptual_roughness: f32 = pbr_bindings::material.perceptual_roughness; 380 let roughness = lighting::perceptualRoughnessToRoughness(perceptual_roughness); 382 if ((flags & pbr_types::STANDARD_MATERIAL_FLAGS_METALLIC_ROUGHNESS_TEXTURE_BIT) != 0u) { 383 let metallic_roughness = 384#ifdef MESHLET_MESH_MATERIAL_PASS 386#else // MESHLET_MESH_MATERIAL_PASS 388#endif // MESHLET_MESH_MATERIAL_PASS 390 bindless_textures_2d[material_indices[slot].metallic_roughness_texture], 391 bindless_samplers_filtering[material_indices[slot].metallic_roughness_sampler], 393 pbr_bindings::metallic_roughness_texture, 394 pbr_bindings::metallic_roughness_sampler, 396#ifdef STANDARD_MATERIAL_METALLIC_ROUGHNESS_UV_B 401#ifdef MESHLET_MESH_MATERIAL_PASS 404#else // MESHLET_MESH_MATERIAL_PASS 406#endif // MESHLET_MESH_MATERIAL_PASS 409 metallic *= metallic_roughness.b; 410 perceptual_roughness *= metallic_roughness.g; 413 pbr_input.material.metallic = metallic; 414 pbr_input.material.perceptual_roughness = perceptual_roughness; 418 pbr_input.material.clearcoat = 419 pbr_bindings::material_array[material_indices[slot].material].clearcoat; 421 pbr_input.material.clearcoat = pbr_bindings::material.clearcoat; 425#ifdef PBR_MULTI_LAYER_MATERIAL_TEXTURES_SUPPORTED 426 if ((flags & pbr_types::STANDARD_MATERIAL_FLAGS_CLEARCOAT_TEXTURE_BIT) != 0u) { 427 pbr_input.material.clearcoat *= 428#ifdef MESHLET_MESH_MATERIAL_PASS 430#else // MESHLET_MESH_MATERIAL_PASS 432#endif // MESHLET_MESH_MATERIAL_PASS 434 bindless_textures_2d[material_indices[slot].clearcoat_texture], 435 bindless_samplers_filtering[material_indices[slot].clearcoat_sampler], 437 pbr_bindings::clearcoat_texture, 438 pbr_bindings::clearcoat_sampler, 440#ifdef STANDARD_MATERIAL_CLEARCOAT_UV_B 445#ifdef MESHLET_MESH_MATERIAL_PASS 448#else // MESHLET_MESH_MATERIAL_PASS 450#endif // MESHLET_MESH_MATERIAL_PASS 453#endif // PBR_MULTI_LAYER_MATERIAL_TEXTURES_SUPPORTED 458 pbr_input.material.clearcoat_perceptual_roughness = 459 pbr_bindings::material_array[material_indices[slot].material].clearcoat_perceptual_roughness; 461 pbr_input.material.clearcoat_perceptual_roughness = 462 pbr_bindings::material.clearcoat_perceptual_roughness; 466#ifdef PBR_MULTI_LAYER_MATERIAL_TEXTURES_SUPPORTED 467 if ((flags & pbr_types::STANDARD_MATERIAL_FLAGS_CLEARCOAT_ROUGHNESS_TEXTURE_BIT) != 0u) { 468 pbr_input.material.clearcoat_perceptual_roughness *= 469#ifdef MESHLET_MESH_MATERIAL_PASS 471#else // MESHLET_MESH_MATERIAL_PASS 473#endif // MESHLET_MESH_MATERIAL_PASS 475 bindless_textures_2d[material_indices[slot].clearcoat_roughness_texture], 476 bindless_samplers_filtering[material_indices[slot].clearcoat_roughness_sampler], 478 pbr_bindings::clearcoat_roughness_texture, 479 pbr_bindings::clearcoat_roughness_sampler, 481#ifdef STANDARD_MATERIAL_CLEARCOAT_ROUGHNESS_UV_B 486#ifdef MESHLET_MESH_MATERIAL_PASS 489#else // MESHLET_MESH_MATERIAL_PASS 491#endif // MESHLET_MESH_MATERIAL_PASS 494#endif // PBR_MULTI_LAYER_MATERIAL_TEXTURES_SUPPORTED 498 var specular_transmission: f32 = pbr_bindings::material_array[slot].specular_transmission; 500 var specular_transmission: f32 = pbr_bindings::material.specular_transmission; 504#ifdef PBR_TRANSMISSION_TEXTURES_SUPPORTED 505 if ((flags & pbr_types::STANDARD_MATERIAL_FLAGS_SPECULAR_TRANSMISSION_TEXTURE_BIT) != 0u) { 506 specular_transmission *= 507#ifdef MESHLET_MESH_MATERIAL_PASS 509#else // MESHLET_MESH_MATERIAL_PASS 511#endif // MESHLET_MESH_MATERIAL_PASS 513 bindless_textures_2d[ 514 material_indices[slot].specular_transmission_texture 516 bindless_samplers_filtering[ 517 material_indices[slot].specular_transmission_sampler 520 pbr_bindings::specular_transmission_texture, 521 pbr_bindings::specular_transmission_sampler, 523#ifdef STANDARD_MATERIAL_SPECULAR_TRANSMISSION_UV_B 528#ifdef MESHLET_MESH_MATERIAL_PASS 531#else // MESHLET_MESH_MATERIAL_PASS 533#endif // MESHLET_MESH_MATERIAL_PASS 538 pbr_input.material.specular_transmission = specular_transmission; 541 var thickness: f32 = pbr_bindings::material_array[material_indices[slot].material].thickness; 543 var thickness: f32 = pbr_bindings::material.thickness; 547#ifdef PBR_TRANSMISSION_TEXTURES_SUPPORTED 548 if ((flags & pbr_types::STANDARD_MATERIAL_FLAGS_THICKNESS_TEXTURE_BIT) != 0u) { 550#ifdef MESHLET_MESH_MATERIAL_PASS 552#else // MESHLET_MESH_MATERIAL_PASS 554#endif // MESHLET_MESH_MATERIAL_PASS 556 bindless_textures_2d[material_indices[slot].thickness_texture], 557 bindless_samplers_filtering[material_indices[slot].thickness_sampler], 559 pbr_bindings::thickness_texture, 560 pbr_bindings::thickness_sampler, 562#ifdef STANDARD_MATERIAL_THICKNESS_UV_B 567#ifdef MESHLET_MESH_MATERIAL_PASS 570#else // MESHLET_MESH_MATERIAL_PASS 572#endif // MESHLET_MESH_MATERIAL_PASS 579#ifndef MESHLET_MESH_MATERIAL_PASS 581 (transpose(mesh[in.instance_index].world_from_local) * vec4(pbr_input.N, 0.0)).xyz 584 pbr_input.material.thickness = thickness; 587 var diffuse_transmission = 588 pbr_bindings::material_array[material_indices[slot].material].diffuse_transmission; 590 var diffuse_transmission = pbr_bindings::material.diffuse_transmission; 594#ifdef PBR_TRANSMISSION_TEXTURES_SUPPORTED 595 if ((flags & pbr_types::STANDARD_MATERIAL_FLAGS_DIFFUSE_TRANSMISSION_TEXTURE_BIT) != 0u) { 596 diffuse_transmission *= 597#ifdef MESHLET_MESH_MATERIAL_PASS 599#else // MESHLET_MESH_MATERIAL_PASS 601#endif // MESHLET_MESH_MATERIAL_PASS 603 bindless_textures_2d[material_indices[slot].diffuse_transmission_texture], 604 bindless_samplers_filtering[material_indices[slot].diffuse_transmission_sampler], 606 pbr_bindings::diffuse_transmission_texture, 607 pbr_bindings::diffuse_transmission_sampler, 609#ifdef STANDARD_MATERIAL_DIFFUSE_TRANSMISSION_UV_B 614#ifdef MESHLET_MESH_MATERIAL_PASS 617#else // MESHLET_MESH_MATERIAL_PASS 619#endif // MESHLET_MESH_MATERIAL_PASS 624 pbr_input.material.diffuse_transmission = diffuse_transmission; 626 var diffuse_occlusion: vec3<f32> = vec3(1.0); 627 var specular_occlusion: f32 = 1.0; 629 if ((flags & pbr_types::STANDARD_MATERIAL_FLAGS_OCCLUSION_TEXTURE_BIT) != 0u) { 631#ifdef MESHLET_MESH_MATERIAL_PASS 633#else // MESHLET_MESH_MATERIAL_PASS 635#endif // MESHLET_MESH_MATERIAL_PASS 637 bindless_textures_2d[material_indices[slot].occlusion_texture], 638 bindless_samplers_filtering[material_indices[slot].occlusion_sampler], 640 pbr_bindings::occlusion_texture, 641 pbr_bindings::occlusion_sampler, 643#ifdef STANDARD_MATERIAL_OCCLUSION_UV_B 648#ifdef MESHLET_MESH_MATERIAL_PASS 651#else // MESHLET_MESH_MATERIAL_PASS 653#endif // MESHLET_MESH_MATERIAL_PASS 657#ifdef SCREEN_SPACE_AMBIENT_OCCLUSION 658 let ssao = textureLoad(screen_space_ambient_occlusion_texture, vec2<i32>(in.position.xy), 0i).r; 659 let ssao_multibounce = ssao_multibounce(ssao, pbr_input.material.base_color.rgb); 660 diffuse_occlusion = min(diffuse_occlusion, ssao_multibounce); 663 specular_occlusion = saturate(pow(NdotV + ssao, exp2(-16.0 * roughness - 1.0)) - 1.0 + ssao); 665 pbr_input.diffuse_occlusion = diffuse_occlusion; 666 pbr_input.specular_occlusion = specular_occlusion; 669#ifndef LOAD_PREPASS_NORMALS 671 pbr_input.N = normalize(pbr_input.world_normal); 672 pbr_input.clearcoat_N = pbr_input.N; 675#ifdef VERTEX_TANGENTS 677 let TBN = pbr_functions::calculate_tbn_mikktspace(pbr_input.world_normal, in.world_tangent); 679#ifdef STANDARD_MATERIAL_NORMAL_MAP 682#ifdef MESHLET_MESH_MATERIAL_PASS 684#else // MESHLET_MESH_MATERIAL_PASS 686#endif // MESHLET_MESH_MATERIAL_PASS 688 bindless_textures_2d[material_indices[slot].normal_map_texture], 689 bindless_samplers_filtering[material_indices[slot].normal_map_sampler], 691 pbr_bindings::normal_map_texture, 692 pbr_bindings::normal_map_sampler, 694#ifdef STANDARD_MATERIAL_NORMAL_MAP_UV_B 699#ifdef MESHLET_MESH_MATERIAL_PASS 702#else // MESHLET_MESH_MATERIAL_PASS 704#endif // MESHLET_MESH_MATERIAL_PASS 707 pbr_input.N = pbr_functions::apply_normal_mapping(flags, TBN, double_sided, is_front, Nt); 709#endif // STANDARD_MATERIAL_NORMAL_MAP 711#ifdef STANDARD_MATERIAL_CLEARCOAT 717#ifdef STANDARD_MATERIAL_CLEARCOAT_NORMAL_MAP 720#ifdef MESHLET_MESH_MATERIAL_PASS 722#else // MESHLET_MESH_MATERIAL_PASS 724#endif // MESHLET_MESH_MATERIAL_PASS 726 bindless_textures_2d[material_indices[slot].clearcoat_normal_texture], 727 bindless_samplers_filtering[material_indices[slot].clearcoat_normal_sampler], 729 pbr_bindings::clearcoat_normal_texture, 730 pbr_bindings::clearcoat_normal_sampler, 732#ifdef STANDARD_MATERIAL_CLEARCOAT_NORMAL_UV_B 737#ifdef MESHLET_MESH_MATERIAL_PASS 740#else // MESHLET_MESH_MATERIAL_PASS 742#endif // MESHLET_MESH_MATERIAL_PASS 745 pbr_input.clearcoat_N = pbr_functions::apply_normal_mapping( 753#endif // STANDARD_MATERIAL_CLEARCOAT_NORMAL_MAP 755#endif // STANDARD_MATERIAL_CLEARCOAT 757#endif // VERTEX_TANGENTS 764#ifdef PBR_ANISOTROPY_TEXTURE_SUPPORTED 765#ifdef VERTEX_TANGENTS 766#ifdef STANDARD_MATERIAL_ANISOTROPY 769 var anisotropy_strength = 770 pbr_bindings::material_array[material_indices[slot].material].anisotropy_strength; 771 var anisotropy_direction = 772 pbr_bindings::material_array[material_indices[slot].material].anisotropy_rotation; 774 var anisotropy_strength = pbr_bindings::material.anisotropy_strength; 775 var anisotropy_direction = pbr_bindings::material.anisotropy_rotation; 779 if ((flags & pbr_types::STANDARD_MATERIAL_FLAGS_ANISOTROPY_TEXTURE_BIT) != 0u) { 780 let anisotropy_texel = 781#ifdef MESHLET_MESH_MATERIAL_PASS 783#else // MESHLET_MESH_MATERIAL_PASS 785#endif // MESHLET_MESH_MATERIAL_PASS 787 bindless_textures_2d[material_indices[slot].anisotropy_texture], 788 bindless_samplers_filtering[material_indices[slot].anisotropy_sampler], 790 pbr_bindings::anisotropy_texture, 791 pbr_bindings::anisotropy_sampler, 793#ifdef STANDARD_MATERIAL_ANISOTROPY_UV_B 795#else // STANDARD_MATERIAL_ANISOTROPY_UV_B 797#endif // STANDARD_MATERIAL_ANISOTROPY_UV_B 798#ifdef MESHLET_MESH_MATERIAL_PASS 801#else // MESHLET_MESH_MATERIAL_PASS 803#endif // MESHLET_MESH_MATERIAL_PASS 806 let anisotropy_direction_from_texture = normalize(anisotropy_texel.rg * 2.0 - 1.0); 808 anisotropy_direction = 809 mat2x2(anisotropy_direction.xy, anisotropy_direction.yx * vec2(-1.0, 1.0)) * 810 anisotropy_direction_from_texture; 811 anisotropy_strength *= anisotropy_texel.b; 814 pbr_input.anisotropy_strength = anisotropy_strength; 816 let anisotropy_T = normalize(TBN * vec3(anisotropy_direction, 0.0)); 817 let anisotropy_B = normalize(cross(pbr_input.world_normal, anisotropy_T)); 818 pbr_input.anisotropy_T = anisotropy_T; 819 pbr_input.anisotropy_B = anisotropy_B; 821#endif // STANDARD_MATERIAL_ANISOTROPY 822#endif // VERTEX_TANGENTS 823#endif // PBR_ANISOTROPY_TEXTURE_SUPPORTED 825#endif // LOAD_PREPASS_NORMALS 831 let lightmap_exposure = 832 pbr_bindings::material_array[material_indices[slot].material].lightmap_exposure; 834 let lightmap_exposure = pbr_bindings::material.lightmap_exposure; 837 pbr_input.lightmap_light = lightmap(in.uv_b, lightmap_exposure, in.instance_index);