[Bf-blender-cvs] [ffa461f13c5] blender2.8: Eevee: Add Filter Quality setting

Clément Foucault noreply at git.blender.org
Thu Nov 15 20:05:03 CET 2018


Commit: ffa461f13c5f37b658ed273876548bcb3c94b9fa
Author: Clément Foucault
Date:   Thu Nov 15 20:04:35 2018 +0100
Branches: blender2.8
https://developer.blender.org/rBffa461f13c5f37b658ed273876548bcb3c94b9fa

Eevee: Add Filter Quality setting

This setting can be tweaked to improve glossy reflection cubemaps.

It increases the sample count for each roughness level.
This settings affect the lookdev mode quality as well.

===================================================================

M	release/scripts/startup/bl_ui/properties_render.py
M	source/blender/blenkernel/intern/scene.c
M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/draw/engines/eevee/eevee_lightcache.c
M	source/blender/draw/engines/eevee/eevee_lightprobes.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/makesrna/intern/rna_scene.c

===================================================================

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);



More information about the Bf-blender-cvs mailing list