3import bevy_pbr::render::rgb9e5::{vec3_to_rgb9e5_, rgb9e5_to_vec3_}; 4import bevy_render::utils::{octahedral_encode, octahedral_decode}; 5import package::scene::sampling::{generate_random_light_sample, ResolvedLightSample}; 6import package::realtime::bindings::{light_tile_samples, light_tile_resolved_samples, view, constants, ResolvedLightSamplePacked}; 10@compute @workgroup_size(1024, 1, 1) 11fn presample_light_tiles(@builtin(workgroup_id) workgroup_id: vec3<u32>, @builtin(local_invocation_index) sample_index: u32) { 12 let tile_id = workgroup_id.x; 13 var rng = (tile_id * 0x9E3779B9u) + sample_index + constants.frame_rng; 15 let sample = generate_random_light_sample(&rng); 17 let i = (tile_id * 1024u) + sample_index; 18 light_tile_samples[i] = sample.light_sample; 19 light_tile_resolved_samples[i] = pack_resolved_light_sample(sample.resolved_light_sample); 22fn pack_resolved_light_sample(sample: ResolvedLightSample) -> ResolvedLightSamplePacked { 23 return ResolvedLightSamplePacked( 24 sample.world_position.x, 25 sample.world_position.y, 26 sample.world_position.z, 27 pack2x16unorm(octahedral_encode(sample.world_normal)), 28 vec3_to_rgb9e5_(log2(sample.radiance * view.exposure + 1.0)), 29 sample.inverse_pdf * select(1.0, -1.0, sample.world_position.w == 0.0), 33fn unpack_resolved_light_sample(packed: ResolvedLightSamplePacked, exposure: f32) -> ResolvedLightSample { 34 return ResolvedLightSample( 35 vec4(packed.world_position_x, packed.world_position_y, packed.world_position_z, select(1.0, 0.0, packed.inverse_pdf < 0.0)), 36 octahedral_decode(unpack2x16unorm(packed.world_normal)), 37 (exp2(rgb9e5_to_vec3_(packed.radiance)) - 1.0) / exposure, 38 abs(packed.inverse_pdf),