Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2017-07-05 20:14:50 +0300
committerClément Foucault <foucault.clem@gmail.com>2017-07-05 20:14:50 +0300
commitf6c739cbcdfe06cafdd8b0e35208c661f7024f07 (patch)
treef05feb9dd00d524262af1036d43c67a391064461
parent031a4d5e22fbb31da74ff9eb51f0346656b530f1 (diff)
Eevee: Volumetrics: Add Light contribution clamping.
This avoid too much variance at light centers and remove some noise.
-rw-r--r--release/scripts/startup/bl_ui/properties_render.py1
-rw-r--r--source/blender/draw/engines/eevee/eevee_effects.c8
-rw-r--r--source/blender/draw/engines/eevee/eevee_engine.c1
-rw-r--r--source/blender/draw/engines/eevee/eevee_private.h2
-rw-r--r--source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl15
-rw-r--r--source/blender/makesrna/intern/rna_scene.c9
6 files changed, 27 insertions, 9 deletions
diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py
index 40307a1d3bb..5dc90850841 100644
--- a/release/scripts/startup/bl_ui/properties_render.py
+++ b/release/scripts/startup/bl_ui/properties_render.py
@@ -704,6 +704,7 @@ class RENDER_PT_eevee_volumetric(RenderButtonsPanel, Panel):
col.prop(props, "volumetric_samples")
col.prop(props, "volumetric_sample_distribution")
col.prop(props, "volumetric_lights")
+ col.prop(props, "volumetric_light_clamp")
col.prop(props, "volumetric_shadows")
col.prop(props, "volumetric_shadow_samples")
col.prop(props, "volumetric_colored_transmittance")
diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c
index 602d4f272b8..86997d44e0f 100644
--- a/source/blender/draw/engines/eevee/eevee_effects.c
+++ b/source/blender/draw/engines/eevee/eevee_effects.c
@@ -434,6 +434,12 @@ void EEVEE_effects_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata)
volumetrics->sample_distribution = BKE_collection_engine_property_value_get_float(props, "volumetric_sample_distribution");
volumetrics->integration_step_count = (float)BKE_collection_engine_property_value_get_int(props, "volumetric_samples");
volumetrics->shadow_step_count = (float)BKE_collection_engine_property_value_get_int(props, "volumetric_shadow_samples");
+ volumetrics->light_clamp = BKE_collection_engine_property_value_get_float(props, "volumetric_light_clamp");
+
+ /* Disable clamp if equal to 0. */
+ if (volumetrics->light_clamp == 0.0) {
+ volumetrics->light_clamp = FLT_MAX;
+ }
volumetrics->use_lights = BKE_collection_engine_property_value_get_bool(props, "volumetric_lights");
volumetrics->use_volume_shadows = BKE_collection_engine_property_value_get_bool(props, "volumetric_shadows");
@@ -522,7 +528,7 @@ void EEVEE_effects_cache_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata)
DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex());
DRW_shgroup_uniform_vec4(grp, "viewvecs[0]", (float *)stl->g_data->viewvecs, 2);
DRW_shgroup_uniform_vec2(grp, "volume_start_end", &sldata->volumetrics->integration_start, 1);
- DRW_shgroup_uniform_vec3(grp, "volume_samples", &sldata->volumetrics->integration_step_count, 1);
+ DRW_shgroup_uniform_vec4(grp, "volume_samples_clamp", &sldata->volumetrics->integration_step_count, 1);
DRW_shgroup_call_add(grp, quad, NULL);
if (volumetrics->use_colored_transmit == false) { /* Monochromatic transmittance */
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index feee13b06f8..3c65e1e1763 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -196,6 +196,7 @@ static void EEVEE_scene_layer_settings_create(RenderEngine *UNUSED(engine), IDPr
BKE_collection_engine_property_add_int(props, "volumetric_samples", 64);
BKE_collection_engine_property_add_float(props, "volumetric_sample_distribution", 0.8);
BKE_collection_engine_property_add_bool(props, "volumetric_lights", true);
+ BKE_collection_engine_property_add_float(props, "volumetric_light_clamp", 0.0f);
BKE_collection_engine_property_add_bool(props, "volumetric_shadows", false);
BKE_collection_engine_property_add_int(props, "volumetric_shadow_samples", 16);
BKE_collection_engine_property_add_bool(props, "volumetric_colored_transmittance", true);
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index 286d833fca3..6175b656521 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -188,7 +188,7 @@ typedef struct EEVEE_ShadowRender {
/* ************ VOLUME DATA ************ */
typedef struct EEVEE_VolumetricsInfo {
- float integration_step_count, shadow_step_count, sample_distribution;
+ float integration_step_count, shadow_step_count, sample_distribution, light_clamp;
float integration_start, integration_end;
bool use_lights, use_volume_shadows, use_colored_transmit;
} EEVEE_VolumetricsInfo;
diff --git a/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl b/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl
index 916ff01b520..56fa126e490 100644
--- a/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl
@@ -6,14 +6,15 @@
uniform int light_count;
uniform vec2 volume_start_end;
-uniform vec3 volume_samples;
+uniform vec4 volume_samples_clamp;
#define volume_start volume_start_end.x
#define volume_end volume_start_end.y
-#define volume_integration_steps volume_samples.x
-#define volume_shadows_steps volume_samples.y
-#define volume_sample_distribution volume_samples.z
+#define volume_integration_steps volume_samples_clamp.x
+#define volume_shadows_steps volume_samples_clamp.y
+#define volume_sample_distribution volume_samples_clamp.z
+#define volume_light_clamp volume_samples_clamp.w
#ifdef COLOR_TRANSMITTANCE
layout(location = 0) out vec4 outScattering;
@@ -74,7 +75,7 @@ float phase_function(vec3 v, vec3 l, float g)
#endif
}
-vec3 light_volume(LightData ld, vec4 l_vector)
+float light_volume(LightData ld, vec4 l_vector)
{
float power;
float dist = max(1e-4, abs(l_vector.w - ld.l_radius));
@@ -87,7 +88,7 @@ vec3 light_volume(LightData ld, vec4 l_vector)
else {
power = 0.0248 * (4.0 * ld.l_radius * ld.l_radius * M_PI * M_PI);
}
- return ld.l_color * power / (l_vector.w * l_vector.w);
+ return min(power / (l_vector.w * l_vector.w), volume_light_clamp);
}
vec3 irradiance_volumetric(vec3 wpos)
@@ -205,7 +206,7 @@ void main()
float Vis = light_visibility(ld, ray_wpos, l_vector);
- vec3 Li = light_volume(ld, l_vector) * light_volume_shadow(ld, ray_wpos, l_vector, s_extinction);
+ vec3 Li = ld.l_color * light_volume(ld, l_vector) * light_volume_shadow(ld, ray_wpos, l_vector, s_extinction);
Lscat += Li * Vis * s_scattering * phase_function(-wdir, l_vector.xyz / l_vector.w, s_anisotropy);
}
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 09a075cb128..c20a54fba69 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -2618,6 +2618,7 @@ RNA_LAYER_ENGINE_EEVEE_GET_SET_FLOAT(volumetric_end)
RNA_LAYER_ENGINE_EEVEE_GET_SET_INT(volumetric_samples)
RNA_LAYER_ENGINE_EEVEE_GET_SET_FLOAT(volumetric_sample_distribution)
RNA_LAYER_ENGINE_EEVEE_GET_SET_BOOL(volumetric_lights)
+RNA_LAYER_ENGINE_EEVEE_GET_SET_FLOAT(volumetric_light_clamp)
RNA_LAYER_ENGINE_EEVEE_GET_SET_BOOL(volumetric_shadows)
RNA_LAYER_ENGINE_EEVEE_GET_SET_INT(volumetric_shadow_samples)
RNA_LAYER_ENGINE_EEVEE_GET_SET_BOOL(volumetric_colored_transmittance)
@@ -6223,6 +6224,14 @@ static void rna_def_scene_layer_engine_settings_eevee(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_SceneLayerEngineSettings_update");
+ prop = RNA_def_property(srna, "volumetric_light_clamp", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_funcs(prop, "rna_LayerEngineSettings_Eevee_volumetric_light_clamp_get",
+ "rna_LayerEngineSettings_Eevee_volumetric_light_clamp_set", NULL);
+ RNA_def_property_range(prop, 0.0f, FLT_MAX);
+ RNA_def_property_ui_text(prop, "Clamp", "Maximum light contribution, reducing noise");
+ RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
+ RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_SceneLayerEngineSettings_update");
+
prop = RNA_def_property(srna, "volumetric_shadows", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_funcs(prop, "rna_LayerEngineSettings_Eevee_volumetric_shadows_get",
"rna_LayerEngineSettings_Eevee_volumetric_shadows_set");