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; 89 let alpha_cutoff = pbr_bindings::material_array[material_indices[slot].material].alpha_cutoff; 91 let flags = pbr_bindings::material.flags; 92 let base_color = pbr_bindings::material.base_color; 93 let deferred_lighting_pass_id = pbr_bindings::material.deferred_lighting_pass_id; 94 let alpha_cutoff = pbr_bindings::material.alpha_cutoff; 97 let double_sided = (flags & pbr_types::STANDARD_MATERIAL_FLAGS_DOUBLE_SIDED_BIT) != 0u; 99 var pbr_input: pbr_types::PbrInput = pbr_input_from_vertex_output(in, is_front, double_sided); 100 pbr_input.material.flags = flags; 101 pbr_input.material.base_color *= base_color; 102 pbr_input.material.deferred_lighting_pass_id = deferred_lighting_pass_id; 105 let NdotV = max(dot(pbr_input.N, pbr_input.V), 0.0001); 108 var bias: SampleBias; 109#ifdef MESHLET_MESH_MATERIAL_PASS 110 bias.ddx_uv = in.ddx_uv; 111 bias.ddy_uv = in.ddy_uv; 112#else // MESHLET_MESH_MATERIAL_PASS 113 bias.mip_bias = view.mip_bias; 114#endif // MESHLET_MESH_MATERIAL_PASS 120 let uv_transform = pbr_bindings::material_array[material_indices[slot].material].uv_transform; 122 let uv_transform = pbr_bindings::material.uv_transform; 125pbr_input.material.uv_transform = uv_transform; 128 var uv = (uv_transform * vec3(in.uv, 1.0)).xy; 133 var uv_b = (uv_transform * vec3(in.uv_b, 1.0)).xy; 138#ifdef VERTEX_TANGENTS 139 if ((flags & pbr_types::STANDARD_MATERIAL_FLAGS_DEPTH_MAP_BIT) != 0u) { 141 let TBN = pbr_functions::calculate_tbn_mikktspace(in.world_normal, in.world_tangent); 146 let Vt = vec3(dot(V, T), dot(V, B), dot(V, N)); 151 pbr_bindings::material_array[material_indices[slot].material].parallax_depth_scale, 152 pbr_bindings::material_array[material_indices[slot].material].max_parallax_layer_count, 153 pbr_bindings::material_array[material_indices[slot].material].max_relief_mapping_search_steps, 155 pbr_bindings::material.parallax_depth_scale, 156 pbr_bindings::material.max_parallax_layer_count, 157 pbr_bindings::material.max_relief_mapping_search_steps, 170 uv_b = parallaxed_uv( 172 pbr_bindings::material_array[material_indices[slot].material].parallax_depth_scale, 173 pbr_bindings::material_array[material_indices[slot].material].max_parallax_layer_count, 174 pbr_bindings::material_array[material_indices[slot].material].max_relief_mapping_search_steps, 176 pbr_bindings::material.parallax_depth_scale, 177 pbr_bindings::material.max_parallax_layer_count, 178 pbr_bindings::material.max_relief_mapping_search_steps, 191#endif // VERTEX_TANGENTS 193 if ((flags & pbr_types::STANDARD_MATERIAL_FLAGS_BASE_COLOR_TEXTURE_BIT) != 0u) { 194 pbr_input.material.base_color *= 195#ifdef MESHLET_MESH_MATERIAL_PASS 197#else // MESHLET_MESH_MATERIAL_PASS 199#endif // MESHLET_MESH_MATERIAL_PASS 201 bindless_textures_2d[material_indices[slot].base_color_texture], 202 bindless_samplers_filtering[material_indices[slot].base_color_sampler], 204 pbr_bindings::base_color_texture, 205 pbr_bindings::base_color_sampler, 207#ifdef STANDARD_MATERIAL_BASE_COLOR_UV_B 212#ifdef MESHLET_MESH_MATERIAL_PASS 215#else // MESHLET_MESH_MATERIAL_PASS 217#endif // MESHLET_MESH_MATERIAL_PASS 220#ifdef ALPHA_TO_COVERAGE 224 let alpha_mode = flags & pbr_types::STANDARD_MATERIAL_FLAGS_ALPHA_MODE_RESERVED_BITS; 225 if alpha_mode == pbr_types::STANDARD_MATERIAL_FLAGS_ALPHA_MODE_ALPHA_TO_COVERAGE { 228 let alpha_cutoff = pbr_bindings::material_array[material_indices[slot].material].alpha_cutoff; 230 let alpha_cutoff = pbr_bindings::material.alpha_cutoff; 233 pbr_input.material.base_color.a = (pbr_input.material.base_color.a - alpha_cutoff) / 234 max(fwidth(pbr_input.material.base_color.a), 0.0001) + 0.5; 236#endif // ALPHA_TO_COVERAGE 241 pbr_input.material.flags = flags; 242 pbr_input.material.alpha_cutoff = alpha_cutoff; 245 if ((flags & pbr_types::STANDARD_MATERIAL_FLAGS_UNLIT_BIT) == 0u) { 247 pbr_input.material.ior = pbr_bindings::material_array[material_indices[slot].material].ior; 248 pbr_input.material.attenuation_color = 249 pbr_bindings::material_array[material_indices[slot].material].attenuation_color; 250 pbr_input.material.attenuation_distance = 251 pbr_bindings::material_array[material_indices[slot].material].attenuation_distance; 253 pbr_input.material.ior = pbr_bindings::material.ior; 254 pbr_input.material.attenuation_color = pbr_bindings::material.attenuation_color; 255 pbr_input.material.attenuation_distance = pbr_bindings::material.attenuation_distance; 260 pbr_input.material.reflectance = 261 pbr_bindings::material_array[material_indices[slot].material].reflectance; 263 pbr_input.material.reflectance = pbr_bindings::material.reflectance; 266#ifdef PBR_SPECULAR_TEXTURES_SUPPORTED 270 if ((flags & pbr_types::STANDARD_MATERIAL_FLAGS_SPECULAR_TEXTURE_BIT) != 0u) { 272#ifdef MESHLET_MESH_MATERIAL_PASS 274#else // MESHLET_MESH_MATERIAL_PASS 276#endif // MESHLET_MESH_MATERIAL_PASS 278 bindless_textures_2d[material_indices[slot].specular_texture], 279 bindless_samplers_filtering[material_indices[slot].specular_sampler], 281 pbr_bindings::specular_texture, 282 pbr_bindings::specular_sampler, 284#ifdef STANDARD_MATERIAL_SPECULAR_UV_B 286#else // STANDARD_MATERIAL_SPECULAR_UV_B 288#endif // STANDARD_MATERIAL_SPECULAR_UV_B 289#ifdef MESHLET_MESH_MATERIAL_PASS 292#else // MESHLET_MESH_MATERIAL_PASS 294#endif // MESHLET_MESH_MATERIAL_PASS 298 pbr_input.material.reflectance *= specular * 0.5; 302 if ((flags & pbr_types::STANDARD_MATERIAL_FLAGS_SPECULAR_TINT_TEXTURE_BIT) != 0u) { 304#ifdef MESHLET_MESH_MATERIAL_PASS 306#else // MESHLET_MESH_MATERIAL_PASS 308#endif // MESHLET_MESH_MATERIAL_PASS 310 bindless_textures_2d[material_indices[slot].specular_tint_texture], 311 bindless_samplers_filtering[material_indices[slot].specular_tint_sampler], 313 pbr_bindings::specular_tint_texture, 314 pbr_bindings::specular_tint_sampler, 316#ifdef STANDARD_MATERIAL_SPECULAR_TINT_UV_B 318#else // STANDARD_MATERIAL_SPECULAR_TINT_UV_B 320#endif // STANDARD_MATERIAL_SPECULAR_TINT_UV_B 321#ifdef MESHLET_MESH_MATERIAL_PASS 324#else // MESHLET_MESH_MATERIAL_PASS 326#endif // MESHLET_MESH_MATERIAL_PASS 328 pbr_input.material.reflectance *= specular_tint; 332#endif // PBR_SPECULAR_TEXTURES_SUPPORTED 336 var emissive: vec4<f32> = pbr_bindings::material_array[material_indices[slot].material].emissive; 338 var emissive: vec4<f32> = pbr_bindings::material.emissive; 342 if ((flags & pbr_types::STANDARD_MATERIAL_FLAGS_EMISSIVE_TEXTURE_BIT) != 0u) { 343 emissive = vec4<f32>(emissive.rgb * 344#ifdef MESHLET_MESH_MATERIAL_PASS 346#else // MESHLET_MESH_MATERIAL_PASS 348#endif // MESHLET_MESH_MATERIAL_PASS 350 bindless_textures_2d[material_indices[slot].emissive_texture], 351 bindless_samplers_filtering[material_indices[slot].emissive_sampler], 353 pbr_bindings::emissive_texture, 354 pbr_bindings::emissive_sampler, 356#ifdef STANDARD_MATERIAL_EMISSIVE_UV_B 361#ifdef MESHLET_MESH_MATERIAL_PASS 364#else // MESHLET_MESH_MATERIAL_PASS 366#endif // MESHLET_MESH_MATERIAL_PASS 371 pbr_input.material.emissive = emissive; 375 var metallic: f32 = pbr_bindings::material_array[material_indices[slot].material].metallic; 376 var perceptual_roughness: f32 = pbr_bindings::material_array[material_indices[slot].material].perceptual_roughness; 378 var metallic: f32 = pbr_bindings::material.metallic; 379 var perceptual_roughness: f32 = pbr_bindings::material.perceptual_roughness; 383 if ((flags & pbr_types::STANDARD_MATERIAL_FLAGS_METALLIC_ROUGHNESS_TEXTURE_BIT) != 0u) { 384 let metallic_roughness = 385#ifdef MESHLET_MESH_MATERIAL_PASS 387#else // MESHLET_MESH_MATERIAL_PASS 389#endif // MESHLET_MESH_MATERIAL_PASS 391 bindless_textures_2d[material_indices[slot].metallic_roughness_texture], 392 bindless_samplers_filtering[material_indices[slot].metallic_roughness_sampler], 394 pbr_bindings::metallic_roughness_texture, 395 pbr_bindings::metallic_roughness_sampler, 397#ifdef STANDARD_MATERIAL_METALLIC_ROUGHNESS_UV_B 402#ifdef MESHLET_MESH_MATERIAL_PASS 405#else // MESHLET_MESH_MATERIAL_PASS 407#endif // MESHLET_MESH_MATERIAL_PASS 410 metallic *= metallic_roughness.b; 411 perceptual_roughness *= metallic_roughness.g; 414 pbr_input.material.metallic = metallic; 415 pbr_input.material.perceptual_roughness = perceptual_roughness; 419 pbr_input.material.clearcoat = 420 pbr_bindings::material_array[material_indices[slot].material].clearcoat; 422 pbr_input.material.clearcoat = pbr_bindings::material.clearcoat; 426#ifdef PBR_MULTI_LAYER_MATERIAL_TEXTURES_SUPPORTED 427 if ((flags & pbr_types::STANDARD_MATERIAL_FLAGS_CLEARCOAT_TEXTURE_BIT) != 0u) { 428 pbr_input.material.clearcoat *= 429#ifdef MESHLET_MESH_MATERIAL_PASS 431#else // MESHLET_MESH_MATERIAL_PASS 433#endif // MESHLET_MESH_MATERIAL_PASS 435 bindless_textures_2d[material_indices[slot].clearcoat_texture], 436 bindless_samplers_filtering[material_indices[slot].clearcoat_sampler], 438 pbr_bindings::clearcoat_texture, 439 pbr_bindings::clearcoat_sampler, 441#ifdef STANDARD_MATERIAL_CLEARCOAT_UV_B 446#ifdef MESHLET_MESH_MATERIAL_PASS 449#else // MESHLET_MESH_MATERIAL_PASS 451#endif // MESHLET_MESH_MATERIAL_PASS 454#endif // PBR_MULTI_LAYER_MATERIAL_TEXTURES_SUPPORTED 459 pbr_input.material.clearcoat_perceptual_roughness = 460 pbr_bindings::material_array[material_indices[slot].material].clearcoat_perceptual_roughness; 462 pbr_input.material.clearcoat_perceptual_roughness = 463 pbr_bindings::material.clearcoat_perceptual_roughness; 467#ifdef PBR_MULTI_LAYER_MATERIAL_TEXTURES_SUPPORTED 468 if ((flags & pbr_types::STANDARD_MATERIAL_FLAGS_CLEARCOAT_ROUGHNESS_TEXTURE_BIT) != 0u) { 469 pbr_input.material.clearcoat_perceptual_roughness *= 470#ifdef MESHLET_MESH_MATERIAL_PASS 472#else // MESHLET_MESH_MATERIAL_PASS 474#endif // MESHLET_MESH_MATERIAL_PASS 476 bindless_textures_2d[material_indices[slot].clearcoat_roughness_texture], 477 bindless_samplers_filtering[material_indices[slot].clearcoat_roughness_sampler], 479 pbr_bindings::clearcoat_roughness_texture, 480 pbr_bindings::clearcoat_roughness_sampler, 482#ifdef STANDARD_MATERIAL_CLEARCOAT_ROUGHNESS_UV_B 487#ifdef MESHLET_MESH_MATERIAL_PASS 490#else // MESHLET_MESH_MATERIAL_PASS 492#endif // MESHLET_MESH_MATERIAL_PASS 495#endif // PBR_MULTI_LAYER_MATERIAL_TEXTURES_SUPPORTED 499 var specular_transmission: f32 = pbr_bindings::material_array[slot].specular_transmission; 501 var specular_transmission: f32 = pbr_bindings::material.specular_transmission; 505#ifdef PBR_TRANSMISSION_TEXTURES_SUPPORTED 506 if ((flags & pbr_types::STANDARD_MATERIAL_FLAGS_SPECULAR_TRANSMISSION_TEXTURE_BIT) != 0u) { 507 specular_transmission *= 508#ifdef MESHLET_MESH_MATERIAL_PASS 510#else // MESHLET_MESH_MATERIAL_PASS 512#endif // MESHLET_MESH_MATERIAL_PASS 514 bindless_textures_2d[ 515 material_indices[slot].specular_transmission_texture 517 bindless_samplers_filtering[ 518 material_indices[slot].specular_transmission_sampler 521 pbr_bindings::specular_transmission_texture, 522 pbr_bindings::specular_transmission_sampler, 524#ifdef STANDARD_MATERIAL_SPECULAR_TRANSMISSION_UV_B 529#ifdef MESHLET_MESH_MATERIAL_PASS 532#else // MESHLET_MESH_MATERIAL_PASS 534#endif // MESHLET_MESH_MATERIAL_PASS 539 pbr_input.material.specular_transmission = specular_transmission; 542 var thickness: f32 = pbr_bindings::material_array[material_indices[slot].material].thickness; 544 var thickness: f32 = pbr_bindings::material.thickness; 548#ifdef PBR_TRANSMISSION_TEXTURES_SUPPORTED 549 if ((flags & pbr_types::STANDARD_MATERIAL_FLAGS_THICKNESS_TEXTURE_BIT) != 0u) { 551#ifdef MESHLET_MESH_MATERIAL_PASS 553#else // MESHLET_MESH_MATERIAL_PASS 555#endif // MESHLET_MESH_MATERIAL_PASS 557 bindless_textures_2d[material_indices[slot].thickness_texture], 558 bindless_samplers_filtering[material_indices[slot].thickness_sampler], 560 pbr_bindings::thickness_texture, 561 pbr_bindings::thickness_sampler, 563#ifdef STANDARD_MATERIAL_THICKNESS_UV_B 568#ifdef MESHLET_MESH_MATERIAL_PASS 571#else // MESHLET_MESH_MATERIAL_PASS 573#endif // MESHLET_MESH_MATERIAL_PASS 580#ifndef MESHLET_MESH_MATERIAL_PASS 582 (transpose(mesh[in.instance_index].world_from_local) * vec4(pbr_input.N, 0.0)).xyz 585 pbr_input.material.thickness = thickness; 588 var diffuse_transmission = 589 pbr_bindings::material_array[material_indices[slot].material].diffuse_transmission; 591 var diffuse_transmission = pbr_bindings::material.diffuse_transmission; 595#ifdef PBR_TRANSMISSION_TEXTURES_SUPPORTED 596 if ((flags & pbr_types::STANDARD_MATERIAL_FLAGS_DIFFUSE_TRANSMISSION_TEXTURE_BIT) != 0u) { 597 diffuse_transmission *= 598#ifdef MESHLET_MESH_MATERIAL_PASS 600#else // MESHLET_MESH_MATERIAL_PASS 602#endif // MESHLET_MESH_MATERIAL_PASS 604 bindless_textures_2d[material_indices[slot].diffuse_transmission_texture], 605 bindless_samplers_filtering[material_indices[slot].diffuse_transmission_sampler], 607 pbr_bindings::diffuse_transmission_texture, 608 pbr_bindings::diffuse_transmission_sampler, 610#ifdef STANDARD_MATERIAL_DIFFUSE_TRANSMISSION_UV_B 615#ifdef MESHLET_MESH_MATERIAL_PASS 618#else // MESHLET_MESH_MATERIAL_PASS 620#endif // MESHLET_MESH_MATERIAL_PASS 625 pbr_input.material.diffuse_transmission = diffuse_transmission; 627 var diffuse_occlusion: vec3<f32> = vec3(1.0); 628 var specular_occlusion: f32 = 1.0; 630 if ((flags & pbr_types::STANDARD_MATERIAL_FLAGS_OCCLUSION_TEXTURE_BIT) != 0u) { 632#ifdef MESHLET_MESH_MATERIAL_PASS 634#else // MESHLET_MESH_MATERIAL_PASS 636#endif // MESHLET_MESH_MATERIAL_PASS 638 bindless_textures_2d[material_indices[slot].occlusion_texture], 639 bindless_samplers_filtering[material_indices[slot].occlusion_sampler], 641 pbr_bindings::occlusion_texture, 642 pbr_bindings::occlusion_sampler, 644#ifdef STANDARD_MATERIAL_OCCLUSION_UV_B 649#ifdef MESHLET_MESH_MATERIAL_PASS 652#else // MESHLET_MESH_MATERIAL_PASS 654#endif // MESHLET_MESH_MATERIAL_PASS 658#ifdef SCREEN_SPACE_AMBIENT_OCCLUSION 659 let ssao = textureLoad(screen_space_ambient_occlusion_texture, vec2<i32>(in.position.xy), 0i).r; 660 let ssao_multibounce = ssao_multibounce(ssao, pbr_input.material.base_color.rgb); 661 diffuse_occlusion = min(diffuse_occlusion, ssao_multibounce); 664 let roughness = lighting::perceptualRoughnessToRoughness(pbr_input.material.perceptual_roughness); 665 specular_occlusion = saturate(pow(NdotV + ssao, exp2(-16.0 * roughness - 1.0)) - 1.0 + ssao); 667 pbr_input.diffuse_occlusion = diffuse_occlusion; 668 pbr_input.specular_occlusion = specular_occlusion; 671#ifndef LOAD_PREPASS_NORMALS 673 pbr_input.N = normalize(pbr_input.world_normal); 674 pbr_input.clearcoat_N = pbr_input.N; 677#ifdef VERTEX_TANGENTS 679 let TBN = pbr_functions::calculate_tbn_mikktspace(pbr_input.world_normal, in.world_tangent); 681#ifdef STANDARD_MATERIAL_NORMAL_MAP 684#ifdef MESHLET_MESH_MATERIAL_PASS 686#else // MESHLET_MESH_MATERIAL_PASS 688#endif // MESHLET_MESH_MATERIAL_PASS 690 bindless_textures_2d[material_indices[slot].normal_map_texture], 691 bindless_samplers_filtering[material_indices[slot].normal_map_sampler], 693 pbr_bindings::normal_map_texture, 694 pbr_bindings::normal_map_sampler, 696#ifdef STANDARD_MATERIAL_NORMAL_MAP_UV_B 701#ifdef MESHLET_MESH_MATERIAL_PASS 704#else // MESHLET_MESH_MATERIAL_PASS 706#endif // MESHLET_MESH_MATERIAL_PASS 709 pbr_input.N = pbr_functions::apply_normal_mapping(flags, TBN, double_sided, is_front, Nt); 711#endif // STANDARD_MATERIAL_NORMAL_MAP 713#ifdef STANDARD_MATERIAL_CLEARCOAT 719#ifdef STANDARD_MATERIAL_CLEARCOAT_NORMAL_MAP 722#ifdef MESHLET_MESH_MATERIAL_PASS 724#else // MESHLET_MESH_MATERIAL_PASS 726#endif // MESHLET_MESH_MATERIAL_PASS 728 bindless_textures_2d[material_indices[slot].clearcoat_normal_texture], 729 bindless_samplers_filtering[material_indices[slot].clearcoat_normal_sampler], 731 pbr_bindings::clearcoat_normal_texture, 732 pbr_bindings::clearcoat_normal_sampler, 734#ifdef STANDARD_MATERIAL_CLEARCOAT_NORMAL_UV_B 739#ifdef MESHLET_MESH_MATERIAL_PASS 742#else // MESHLET_MESH_MATERIAL_PASS 744#endif // MESHLET_MESH_MATERIAL_PASS 747 pbr_input.clearcoat_N = pbr_functions::apply_normal_mapping( 755#endif // STANDARD_MATERIAL_CLEARCOAT_NORMAL_MAP 757#endif // STANDARD_MATERIAL_CLEARCOAT 759#endif // VERTEX_TANGENTS 766#ifdef PBR_ANISOTROPY_TEXTURE_SUPPORTED 767#ifdef VERTEX_TANGENTS 768#ifdef STANDARD_MATERIAL_ANISOTROPY 771 var anisotropy_strength = 772 pbr_bindings::material_array[material_indices[slot].material].anisotropy_strength; 773 var anisotropy_direction = 774 pbr_bindings::material_array[material_indices[slot].material].anisotropy_rotation; 776 var anisotropy_strength = pbr_bindings::material.anisotropy_strength; 777 var anisotropy_direction = pbr_bindings::material.anisotropy_rotation; 781 if ((flags & pbr_types::STANDARD_MATERIAL_FLAGS_ANISOTROPY_TEXTURE_BIT) != 0u) { 782 let anisotropy_texel = 783#ifdef MESHLET_MESH_MATERIAL_PASS 785#else // MESHLET_MESH_MATERIAL_PASS 787#endif // MESHLET_MESH_MATERIAL_PASS 789 bindless_textures_2d[material_indices[slot].anisotropy_texture], 790 bindless_samplers_filtering[material_indices[slot].anisotropy_sampler], 792 pbr_bindings::anisotropy_texture, 793 pbr_bindings::anisotropy_sampler, 795#ifdef STANDARD_MATERIAL_ANISOTROPY_UV_B 797#else // STANDARD_MATERIAL_ANISOTROPY_UV_B 799#endif // STANDARD_MATERIAL_ANISOTROPY_UV_B 800#ifdef MESHLET_MESH_MATERIAL_PASS 803#else // MESHLET_MESH_MATERIAL_PASS 805#endif // MESHLET_MESH_MATERIAL_PASS 808 let anisotropy_direction_from_texture = normalize(anisotropy_texel.rg * 2.0 - 1.0); 810 anisotropy_direction = 811 mat2x2(anisotropy_direction.xy, anisotropy_direction.yx * vec2(-1.0, 1.0)) * 812 anisotropy_direction_from_texture; 813 anisotropy_strength *= anisotropy_texel.b; 816 pbr_input.anisotropy_strength = anisotropy_strength; 818 let anisotropy_T = normalize(TBN * vec3(anisotropy_direction, 0.0)); 819 let anisotropy_B = normalize(cross(pbr_input.world_normal, anisotropy_T)); 820 pbr_input.anisotropy_T = anisotropy_T; 821 pbr_input.anisotropy_B = anisotropy_B; 823#endif // STANDARD_MATERIAL_ANISOTROPY 824#endif // VERTEX_TANGENTS 825#endif // PBR_ANISOTROPY_TEXTURE_SUPPORTED 827#endif // LOAD_PREPASS_NORMALS 833 let lightmap_exposure = 834 pbr_bindings::material_array[material_indices[slot].material].lightmap_exposure; 836 let lightmap_exposure = pbr_bindings::material.lightmap_exposure; 839 pbr_input.lightmap_light = lightmap(in.uv_b, lightmap_exposure, in.instance_index);