diff --git a/crates/bevy_solari/src/realtime/world_cache_compact.wgsl b/crates/bevy_solari/src/realtime/world_cache_compact.wgsl index 71585223a5e44..95fc6969837d8 100644 --- a/crates/bevy_solari/src/realtime/world_cache_compact.wgsl +++ b/crates/bevy_solari/src/realtime/world_cache_compact.wgsl @@ -65,6 +65,6 @@ fn compact_world_cache_write_active_cells( if thread_index == 1023u && workgroup_id.x == 1023u { world_cache_active_cells_count = compacted_index + 1u; // TODO: This is 1 even when there are zero active entries in the cache - world_cache_active_cells_dispatch = vec3((world_cache_active_cells_count + 1023u) / 1024u, 1u, 1u); + world_cache_active_cells_dispatch = vec3((world_cache_active_cells_count + 63u) / 64u, 1u, 1u); } } diff --git a/crates/bevy_solari/src/realtime/world_cache_query.wgsl b/crates/bevy_solari/src/realtime/world_cache_query.wgsl index dac506836badc..16cae496fa55a 100644 --- a/crates/bevy_solari/src/realtime/world_cache_query.wgsl +++ b/crates/bevy_solari/src/realtime/world_cache_query.wgsl @@ -13,7 +13,7 @@ const WORLD_CACHE_MAX_SEARCH_STEPS: u32 = 3u; /// The size of a cache cell at the lowest LOD in meters const WORLD_CACHE_POSITION_BASE_CELL_SIZE: f32 = 0.25; /// How fast the world cache transitions between LODs as a function of distance to the camera -const WORLD_CACHE_POSITION_LOD_SCALE: f32 = 30.0; +const WORLD_CACHE_POSITION_LOD_SCALE: f32 = 8.0; /// Marker value for an empty cell const WORLD_CACHE_EMPTY_CELL: u32 = 0u; diff --git a/crates/bevy_solari/src/realtime/world_cache_update.wgsl b/crates/bevy_solari/src/realtime/world_cache_update.wgsl index 44a387c8fce71..11d7a29c2c6be 100644 --- a/crates/bevy_solari/src/realtime/world_cache_update.wgsl +++ b/crates/bevy_solari/src/realtime/world_cache_update.wgsl @@ -3,7 +3,7 @@ #import bevy_render::view::View #import bevy_solari::presample_light_tiles::{ResolvedLightSamplePacked, unpack_resolved_light_sample} #import bevy_solari::sampling::{calculate_resolved_light_contribution, trace_light_visibility} -#import bevy_solari::scene_bindings::{trace_ray, resolve_ray_hit_full, RAY_T_MIN, RAY_T_MAX} +#import bevy_solari::scene_bindings::{trace_ray, resolve_ray_hit_full, RAY_T_MIN} #import bevy_solari::world_cache::{ WORLD_CACHE_MAX_TEMPORAL_SAMPLES, query_world_cache, @@ -20,8 +20,9 @@ struct PushConstants { frame_index: u32, reset: u32 } var constants: PushConstants; const DIRECT_LIGHT_SAMPLE_COUNT: u32 = 32u; +const MAX_GI_RAY_DISTANCE: f32 = 4.0; -@compute @workgroup_size(1024, 1, 1) +@compute @workgroup_size(64, 1, 1) fn sample_radiance(@builtin(workgroup_id) workgroup_id: vec3, @builtin(global_invocation_id) active_cell_id: vec3) { if active_cell_id.x < world_cache_active_cells_count { let cell_index = world_cache_active_cell_indices[active_cell_id.x]; @@ -34,7 +35,7 @@ fn sample_radiance(@builtin(workgroup_id) workgroup_id: vec3, @builtin(glob #ifndef NO_MULTIBOUNCE let ray_direction = sample_cosine_hemisphere(geometry_data.world_normal, &rng); - let ray_hit = trace_ray(geometry_data.world_position, ray_direction, RAY_T_MIN, RAY_T_MAX, RAY_FLAG_NONE); + let ray_hit = trace_ray(geometry_data.world_position, ray_direction, RAY_T_MIN, MAX_GI_RAY_DISTANCE, RAY_FLAG_NONE); if ray_hit.kind != RAY_QUERY_INTERSECTION_NONE { let ray_hit = resolve_ray_hit_full(ray_hit); new_radiance += ray_hit.material.base_color * query_world_cache(ray_hit.world_position, ray_hit.geometric_world_normal, view.world_position, &rng); @@ -45,7 +46,7 @@ fn sample_radiance(@builtin(workgroup_id) workgroup_id: vec3, @builtin(glob } } -@compute @workgroup_size(1024, 1, 1) +@compute @workgroup_size(64, 1, 1) fn blend_new_samples(@builtin(global_invocation_id) active_cell_id: vec3) { if active_cell_id.x < world_cache_active_cells_count { let cell_index = world_cache_active_cell_indices[active_cell_id.x];