1import package::light_probe::{light_probe_iterator_new, light_probe_iterator_next}; 2import package::render::mesh_view_bindings::{ 5 irradiance_volume_sampler, 8import package::render::clustered_forward::ClusterableObjectIndexRanges; 10@if(LIGHTMAP) import package::render::mesh_view_types::LIGHT_PROBE_FLAG_AFFECTS_LIGHTMAPPED_MESH_DIFFUSE; 12@if(IRRADIANCE_VOLUMES_ARE_USABLE) 17fn irradiance_volume_light( 18 world_position: vec3<f32>, 20 clusterable_object_index_ranges: ptr<function, ClusterableObjectIndexRanges>, 24 var iterator = light_probe_iterator_new( 27 clusterable_object_index_ranges, 30 var total_weight = 0.0; 31 var total_irradiance = vec3(0.0); 34 var query_result = light_probe_iterator_next(&iterator); 37 if (query_result.texture_index < 0) { 44 if ((query_result.flags & LIGHT_PROBE_FLAG_AFFECTS_LIGHTMAPPED_MESH_DIFFUSE) == 0u) { 48 @if(MULTIPLE_LIGHT_PROBES_IN_ARRAY) 49 let irradiance_volume_texture = irradiance_volumes[query_result.texture_index]; 51 let irradiance_volume_texture = irradiance_volume; 53 let atlas_resolution = vec3<f32>(textureDimensions(irradiance_volume_texture)); 54 let resolution = vec3<f32>(textureDimensions(irradiance_volume_texture) / vec3(1u, 2u, 3u)); 57 var unit_pos = (query_result.light_from_world * vec4(world_position, 1.0f)).xyz; 58 let stp = clamp((unit_pos + 0.5) * resolution, vec3(0.5f), resolution - vec3(0.5f)); 59 let uvw = stp / atlas_resolution; 63 let neg_offset = select(vec3(0.0f), vec3(0.5f), N < vec3(0.0f)); 65 let uvw_x = uvw + vec3(0.0f, neg_offset.x, 0.0f); 66 let uvw_y = uvw + vec3(0.0f, neg_offset.y, 1.0f / 3.0f); 67 let uvw_z = uvw + vec3(0.0f, neg_offset.z, 2.0f / 3.0f); 69 let rgb_x = textureSampleLevel(irradiance_volume_texture, irradiance_volume_sampler, uvw_x, 0.0).rgb; 70 let rgb_y = textureSampleLevel(irradiance_volume_texture, irradiance_volume_sampler, uvw_y, 0.0).rgb; 71 let rgb_z = textureSampleLevel(irradiance_volume_texture, irradiance_volume_sampler, uvw_z, 0.0).rgb; 75 total_irradiance += (rgb_x * NN.x + rgb_y * NN.y + rgb_z * NN.z) * query_result.intensity * 78 total_weight += query_result.weight; 81 if (total_weight != 0.0) { 82 total_irradiance /= total_weight; 85 return total_irradiance;