diff options
-rw-r--r-- | release/scripts/startup/bl_ui/properties_render.py | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/scene.c | 1 | ||||
-rw-r--r-- | source/blender/blenloader/intern/versioning_280.c | 6 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_lightcache.c | 10 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_lightprobes.c | 5 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_private.h | 2 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_scene_types.h | 2 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_scene.c | 6 |
8 files changed, 28 insertions, 5 deletions
diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py index 3e5be909414..18be337c204 100644 --- a/release/scripts/startup/bl_ui/properties_render.py +++ b/release/scripts/startup/bl_ui/properties_render.py @@ -448,6 +448,7 @@ class RENDER_PT_eevee_indirect_lighting(RenderButtonsPanel, Panel): col.prop(props, "gi_visibility_resolution", text="Diffuse Occlusion") col.prop(props, "gi_irradiance_smoothing") col.prop(props, "gi_glossy_clamp") + col.prop(props, "gi_filter_quality") class RENDER_PT_eevee_indirect_lighting_display(RenderButtonsPanel, Panel): diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index bd991d60681..f4e918da4f0 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -873,6 +873,7 @@ void BKE_scene_init(Scene *sce) sce->eevee.gi_cubemap_draw_size = 0.3f; sce->eevee.gi_irradiance_draw_size = 0.1f; sce->eevee.gi_irradiance_smoothing = 0.1f; + sce->eevee.gi_filter_quality = 1.0f; sce->eevee.taa_samples = 16; sce->eevee.taa_render_samples = 64; diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c index afed64a0722..0be1c048bfb 100644 --- a/source/blender/blenloader/intern/versioning_280.c +++ b/source/blender/blenloader/intern/versioning_280.c @@ -2277,6 +2277,12 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain) } } + if (!DNA_struct_elem_find(fd->filesdna, "SceneEEVEE", "float", "gi_filter_quality")) { + for (Scene *scene = bmain->scene.first; scene; scene = scene->id.next) { + scene->eevee.gi_filter_quality = 1.0f; + } + } + if (!DNA_struct_elem_find(fd->filesdna, "Lamp", "float", "att_dist")) { for (Lamp *la = bmain->lamp.first; la; la = la->id.next) { la->att_dist = la->clipend; diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.c b/source/blender/draw/engines/eevee/eevee_lightcache.c index 3b6c21ee1b7..207179edd49 100644 --- a/source/blender/draw/engines/eevee/eevee_lightcache.c +++ b/source/blender/draw/engines/eevee/eevee_lightcache.c @@ -742,6 +742,7 @@ static void eevee_lightbake_render_world_sample(void *ved, void *user_data) Scene *scene_eval = DEG_get_evaluated_scene(lbake->depsgraph); LightCache *lcache = scene_eval->eevee.light_cache; float clamp = scene_eval->eevee.gi_glossy_clamp; + float filter_quality = scene_eval->eevee.gi_filter_quality; /* TODO do this once for the whole bake when we have independent DRWManagers. */ eevee_lightbake_cache_create(vedata, lbake); @@ -750,7 +751,7 @@ static void eevee_lightbake_render_world_sample(void *ved, void *user_data) sldata->common_data.ray_depth = 1; DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data); EEVEE_lightbake_render_world(sldata, vedata, lbake->rt_fb); - EEVEE_lightbake_filter_glossy(sldata, vedata, lbake->rt_color, lbake->store_fb, 0, 1.0f, lcache->mips_len, clamp); + EEVEE_lightbake_filter_glossy(sldata, vedata, lbake->rt_color, lbake->store_fb, 0, 1.0f, lcache->mips_len, filter_quality, clamp); sldata->common_data.ray_type = EEVEE_RAY_DIFFUSE; sldata->common_data.ray_depth = 1; @@ -925,6 +926,7 @@ static void eevee_lightbake_render_probe_sample(void *ved, void *user_data) EEVEE_LightProbe *eprobe = lbake->cube; LightProbe *prb = *lbake->probe; float clamp = scene_eval->eevee.gi_glossy_clamp; + float filter_quality = scene_eval->eevee.gi_filter_quality; /* TODO do this once for the whole bake when we have independent DRWManagers. */ eevee_lightbake_cache_create(vedata, lbake); @@ -939,7 +941,7 @@ static void eevee_lightbake_render_probe_sample(void *ved, void *user_data) EEVEE_lightbake_render_scene(sldata, vedata, lbake->rt_fb, eprobe->position, prb->clipsta, prb->clipend); EEVEE_lightbake_filter_glossy(sldata, vedata, lbake->rt_color, lbake->store_fb, lbake->cube_offset,prb->intensity, - lcache->mips_len, clamp); + lcache->mips_len, filter_quality, clamp); lcache->cube_len += 1; @@ -1175,6 +1177,7 @@ void EEVEE_lightbake_update_world_quick(EEVEE_ViewLayerData *sldata, EEVEE_Data { LightCache *lcache = vedata->stl->g_data->light_cache; float clamp = scene->eevee.gi_glossy_clamp; + float filter_quality = scene->eevee.gi_filter_quality; EEVEE_LightBake lbake = { .resource_only = true @@ -1189,7 +1192,8 @@ void EEVEE_lightbake_update_world_quick(EEVEE_ViewLayerData *sldata, EEVEE_Data sldata->common_data.ray_depth = 1; DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data); EEVEE_lightbake_render_world(sldata, vedata, lbake.rt_fb); - EEVEE_lightbake_filter_glossy(sldata, vedata, lbake.rt_color, lbake.store_fb, 0, 1.0f, lcache->mips_len, clamp); + EEVEE_lightbake_filter_glossy(sldata, vedata, lbake.rt_color, lbake.store_fb, 0, 1.0f, lcache->mips_len, + filter_quality, clamp); sldata->common_data.ray_type = EEVEE_RAY_DIFFUSE; sldata->common_data.ray_depth = 1; diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c index 56690551e9c..37276987f8d 100644 --- a/source/blender/draw/engines/eevee/eevee_lightprobes.c +++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c @@ -1103,7 +1103,7 @@ static void eevee_lightbake_render_scene_to_planars( void EEVEE_lightbake_filter_glossy( EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, struct GPUTexture *rt_color, struct GPUFrameBuffer *fb, - int probe_idx, float intensity, int maxlevel, float firefly_fac) + int probe_idx, float intensity, int maxlevel, float filter_quality, float firefly_fac) { EEVEE_PassList *psl = vedata->psl; EEVEE_LightProbesInfo *pinfo = sldata->probes; @@ -1149,6 +1149,9 @@ void EEVEE_lightbake_filter_glossy( #else /* Constant Sample count (slow) */ pinfo->samples_len = 1024.0f; #endif + /* Cannot go higher than HAMMERSLEY_SIZE */ + CLAMP(filter_quality, 1.0f, 8.0f); + pinfo->samples_len *= filter_quality; pinfo->samples_len_inv = 1.0f / pinfo->samples_len; pinfo->lodfactor = bias + 0.5f * log((float)(target_size * target_size) * pinfo->samples_len_inv) / log(2); diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h index c18be0f43b1..5a87f782151 100644 --- a/source/blender/draw/engines/eevee/eevee_private.h +++ b/source/blender/draw/engines/eevee/eevee_private.h @@ -889,7 +889,7 @@ void EEVEE_lightbake_render_scene( const float pos[3], float near_clip, float far_clip); void EEVEE_lightbake_filter_glossy( EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, struct GPUTexture *rt_color, struct GPUFrameBuffer *fb, - int probe_idx, float intensity, int maxlevel, float firefly_fac); + int probe_idx, float intensity, int maxlevel, float filter_quality, float firefly_fac); void EEVEE_lightbake_filter_diffuse( EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, struct GPUTexture *rt_color, struct GPUFrameBuffer *fb, int grid_offset, float intensity); diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index a4ceaf04942..3d352d4540f 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -1462,6 +1462,8 @@ typedef struct SceneEEVEE { int gi_visibility_resolution; float gi_irradiance_smoothing; float gi_glossy_clamp; + float gi_filter_quality; + float pad; float gi_cubemap_draw_size; float gi_irradiance_draw_size; diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 23e8b13be42..4791fbdc642 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -5696,6 +5696,12 @@ static void rna_def_scene_eevee(BlenderRNA *brna) RNA_def_property_range(prop, 0.0f, FLT_MAX); RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC); + prop = RNA_def_property(srna, "gi_filter_quality", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_default(prop, 1.0f); + RNA_def_property_ui_text(prop, "Filter Quality", "Take more samples during cubemap filtering to remove artifacts"); + RNA_def_property_range(prop, 1.0f, 8.0f); + RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC); + prop = RNA_def_property(srna, "gi_show_irradiance", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", SCE_EEVEE_SHOW_IRRADIANCE); RNA_def_property_boolean_default(prop, 0); |