From ba06234309ee1b4510ad5251b9957853c572e24c Mon Sep 17 00:00:00 2001 From: retrotails <10767978+retrotails@users.noreply.github.com> Date: Wed, 21 May 2025 06:29:07 -0400 Subject: [PATCH] Fix light range in voxel GI --- servers/rendering/renderer_rd/environment/gi.cpp | 7 ++++++- servers/rendering/renderer_rd/environment/gi.h | 5 +++-- .../renderer_rd/shaders/environment/voxel_gi.glsl | 10 +++++++--- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/servers/rendering/renderer_rd/environment/gi.cpp b/servers/rendering/renderer_rd/environment/gi.cpp index b6a637758a..dacb122e46 100644 --- a/servers/rendering/renderer_rd/environment/gi.cpp +++ b/servers/rendering/renderer_rd/environment/gi.cpp @@ -2943,6 +2943,10 @@ void GI::VoxelGIInstance::update(bool p_update_light_instances, const Vectorvoxel_gi_get_octree_size(probe) / gi->voxel_gi_get_bounds(probe).size; + float cell_size = (1.0 / MAX(MAX(ps.x, ps.y), ps.z)); + if (has_dynamic_object_data || p_update_light_instances || p_dynamic_objects.size()) { // PROCESS MIPMAPS if (mipmaps.size()) { @@ -2961,6 +2965,7 @@ void GI::VoxelGIInstance::update(bool p_update_light_instances, const Vectorvoxel_gi_get_dynamic_range(probe); push_constant.light_count = light_count; push_constant.aniso_strength = 0; + push_constant.cell_size = cell_size; /* print_line("probe update to version " + itos(last_probe_version)); print_line("propagation " + rtos(push_constant.propagation)); @@ -3161,9 +3166,9 @@ void GI::VoxelGIInstance::update(bool p_update_light_instances, const Vectorvoxel_gi_get_propagation(probe); + push_constant.cell_size = cell_size; push_constant.pad[0] = 0; push_constant.pad[1] = 0; - push_constant.pad[2] = 0; //process lighting RD::ComputeListID compute_list = RD::get_singleton()->compute_list_begin(); diff --git a/servers/rendering/renderer_rd/environment/gi.h b/servers/rendering/renderer_rd/environment/gi.h index 0e21e85d75..adb1c6f1a0 100644 --- a/servers/rendering/renderer_rd/environment/gi.h +++ b/servers/rendering/renderer_rd/environment/gi.h @@ -188,7 +188,7 @@ private: uint32_t cell_offset; uint32_t cell_count; float aniso_strength; - uint32_t pad; + float cell_size; }; struct VoxelGIDynamicPushConstant { @@ -209,7 +209,8 @@ private: float dynamic_range; uint32_t on_mipmap; float propagation; - float pad[3]; + float cell_size; + float pad[2]; }; VoxelGILight *voxel_gi_lights = nullptr; diff --git a/servers/rendering/renderer_rd/shaders/environment/voxel_gi.glsl b/servers/rendering/renderer_rd/shaders/environment/voxel_gi.glsl index 6e9e0f82b3..12137e94f7 100644 --- a/servers/rendering/renderer_rd/shaders/environment/voxel_gi.glsl +++ b/servers/rendering/renderer_rd/shaders/environment/voxel_gi.glsl @@ -86,7 +86,7 @@ layout(push_constant, std430) uniform Params { uint cell_offset; uint cell_count; float aniso_strength; - uint pad; + float cell_size; } params; @@ -126,7 +126,8 @@ layout(push_constant, std430) uniform Params { float dynamic_range; bool on_mipmap; float propagation; - float pad[3]; + float cell_size; + float pad[2]; } params; @@ -209,7 +210,10 @@ bool compute_light_vector(uint light, vec3 pos, out float attenuation, out vec3 return false; } - attenuation = get_omni_attenuation(distance, 1.0 / lights.data[light].radius, lights.data[light].attenuation); + attenuation = get_omni_attenuation( + distance * params.cell_size, + 1.0 / (lights.data[light].radius * params.cell_size), + lights.data[light].attenuation); if (lights.data[light].type == LIGHT_TYPE_SPOT) { vec3 rel = normalize(pos - light_pos);