diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-07-05 20:14:50 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-07-05 20:14:50 +0300 |
commit | f6c739cbcdfe06cafdd8b0e35208c661f7024f07 (patch) | |
tree | f05feb9dd00d524262af1036d43c67a391064461 | |
parent | 031a4d5e22fbb31da74ff9eb51f0346656b530f1 (diff) |
Eevee: Volumetrics: Add Light contribution clamping.
This avoid too much variance at light centers and remove some noise.
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"); |