Commit: 1b321048a7ebbb99d62c8d8e74446153ef487a59
Author: Clément Foucault
Date:   Thu Nov 15 19:41:15 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB1b321048a7ebbb99d62c8d8e74446153ef487a59

Eevee: Add Glossy Reflection clamping

This enables reducing the noise comming from very bright light sources
(like a sun) that can be found in distant HDRIs.

The lost energy may be replaced manually by a sunlight that compensate the
this loss.

This clamping only concerns Reflection Cubmaps and is done on all on all
of them.

Setting to 0.0 disables it (default).

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

M       release/scripts/startup/bl_ui/properties_render.py
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/draw/engines/eevee/shaders/lightprobe_filter_glossy_frag.glsl
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 d16ba8b8621..3e5be909414 100644
--- a/release/scripts/startup/bl_ui/properties_render.py
+++ b/release/scripts/startup/bl_ui/properties_render.py
@@ -447,6 +447,7 @@ class RENDER_PT_eevee_indirect_lighting(RenderButtonsPanel, 
Panel):
         col.prop(props, "gi_cubemap_resolution")
         col.prop(props, "gi_visibility_resolution", text="Diffuse Occlusion")
         col.prop(props, "gi_irradiance_smoothing")
+        col.prop(props, "gi_glossy_clamp")
 
 
 class RENDER_PT_eevee_indirect_lighting_display(RenderButtonsPanel, Panel):
diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.c 
b/source/blender/draw/engines/eevee/eevee_lightcache.c
index 873a63db355..3b6c21ee1b7 100644
--- a/source/blender/draw/engines/eevee/eevee_lightcache.c
+++ b/source/blender/draw/engines/eevee/eevee_lightcache.c
@@ -118,7 +118,6 @@ typedef struct EEVEE_LightBake {
        int grid_sample_len;             /* Total number of samples for the 
current grid. */
        int grid_curr;                   /* Nth grid in the cache being 
rendered. */
        int bounce_curr, bounce_len;     /* The current light bounce being 
evaluated. */
-       float vis_range, vis_blur;       /* Sample Visibility compression and 
bluring. */
        float vis_res;                   /* Resolution of the Visibility 
shadowmap. */
        GPUTexture *grid_prev;           /* Result of previous light bounce. */
        LightProbe **grid_prb;           /* Pointer to the id.data of the probe 
object. */
@@ -127,9 +126,6 @@ typedef struct EEVEE_LightBake {
        EEVEE_LightProbe *cube;          /* Current probe being rendered (UBO 
data). */
        int ref_cube_res;                /* Target cubemap at MIP 0. */
        int cube_offset;                 /* Index of the current cube. */
-       float probemat[6][4][4];         /* ViewProjection matrix for each cube 
face. */
-       float texel_size, padding_size;  /* Texel and padding size for the 
final octahedral map. */
-       float roughness;                 /* Roughness level of the current 
mipmap. */
        LightProbe **cube_prb;           /* Pointer to the id.data of the probe 
object. */
 
        /* Dummy Textures */
@@ -745,12 +741,21 @@ static void eevee_lightbake_render_world_sample(void 
*ved, void *user_data)
        EEVEE_LightBake *lbake = (EEVEE_LightBake *)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;
 
        /* TODO do this once for the whole bake when we have independent 
DRWManagers. */
        eevee_lightbake_cache_create(vedata, lbake);
 
+       sldata->common_data.ray_type = EEVEE_RAY_GLOSSY;
+       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);
+
+       sldata->common_data.ray_type = EEVEE_RAY_DIFFUSE;
+       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);
        EEVEE_lightbake_filter_diffuse(sldata, vedata, lbake->rt_color, 
lbake->store_fb, 0, 1.0f);
 
        /* Clear the cache to avoid white values in the grid. */
@@ -919,6 +924,7 @@ static void eevee_lightbake_render_probe_sample(void *ved, 
void *user_data)
        LightCache *lcache = scene_eval->eevee.light_cache;
        EEVEE_LightProbe *eprobe = lbake->cube;
        LightProbe *prb = *lbake->probe;
+       float clamp = scene_eval->eevee.gi_glossy_clamp;
 
        /* TODO do this once for the whole bake when we have independent 
DRWManagers. */
        eevee_lightbake_cache_create(vedata, lbake);
@@ -932,7 +938,8 @@ static void eevee_lightbake_render_probe_sample(void *ved, 
void *user_data)
        DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_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);
+       EEVEE_lightbake_filter_glossy(sldata, vedata, lbake->rt_color, 
lbake->store_fb, lbake->cube_offset,prb->intensity,
+                                     lcache->mips_len, clamp);
 
        lcache->cube_len += 1;
 
@@ -1167,6 +1174,7 @@ void EEVEE_lightbake_job(void *custom_data, short *stop, 
short *do_update, float
 void EEVEE_lightbake_update_world_quick(EEVEE_ViewLayerData *sldata, 
EEVEE_Data *vedata, const Scene *scene)
 {
        LightCache *lcache = vedata->stl->g_data->light_cache;
+       float clamp = scene->eevee.gi_glossy_clamp;
 
        EEVEE_LightBake lbake = {
                .resource_only = true
@@ -1181,7 +1189,7 @@ 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);
+       EEVEE_lightbake_filter_glossy(sldata, vedata, lbake.rt_color, 
lbake.store_fb, 0, 1.0f, lcache->mips_len, 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 e4659306f5c..56690551e9c 100644
--- a/source/blender/draw/engines/eevee/eevee_lightprobes.c
+++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c
@@ -376,6 +376,7 @@ void EEVEE_lightbake_cache_init(EEVEE_ViewLayerData 
*sldata, EEVEE_Data *vedata,
                DRW_shgroup_uniform_float(grp, "lodMax", &pinfo->lod_rt_max, 1);
                DRW_shgroup_uniform_float(grp, "texelSize", &pinfo->texel_size, 
1);
                DRW_shgroup_uniform_float(grp, "paddingSize", 
&pinfo->padding_size, 1);
+               DRW_shgroup_uniform_float(grp, "fireflyFactor", 
&pinfo->firefly_fac, 1);
                DRW_shgroup_uniform_int(grp, "Layer", &pinfo->layer, 1);
                DRW_shgroup_uniform_texture(grp, "texHammersley", 
e_data.hammersley);
                // DRW_shgroup_uniform_texture(grp, "texJitter", e_data.jitter);
@@ -1102,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)
+        int probe_idx, float intensity, int maxlevel, float firefly_fac)
 {
        EEVEE_PassList *psl = vedata->psl;
        EEVEE_LightProbesInfo *pinfo = sldata->probes;
@@ -1151,6 +1152,7 @@ void EEVEE_lightbake_filter_glossy(
 
                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);
+               pinfo->firefly_fac = (firefly_fac > 0.0) ? firefly_fac : 1e16;
 
                GPU_framebuffer_ensure_config(&fb, {
                        GPU_ATTACHMENT_NONE,
diff --git a/source/blender/draw/engines/eevee/eevee_private.h 
b/source/blender/draw/engines/eevee/eevee_private.h
index 09e444c40b2..c18be0f43b1 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -480,6 +480,7 @@ typedef struct EEVEE_LightProbesInfo {
        float near_clip;
        float far_clip;
        float roughness;
+       float firefly_fac;
        float lodfactor;
        float lod_rt_max, lod_cube_max, lod_planar_max;
        float visibility_range;
@@ -888,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);
+        int probe_idx, float intensity, int maxlevel, 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/draw/engines/eevee/shaders/lightprobe_filter_glossy_frag.glsl 
b/source/blender/draw/engines/eevee/shaders/lightprobe_filter_glossy_frag.glsl
index bb23051b7e5..fdfee54f368 100644
--- 
a/source/blender/draw/engines/eevee/shaders/lightprobe_filter_glossy_frag.glsl
+++ 
b/source/blender/draw/engines/eevee/shaders/lightprobe_filter_glossy_frag.glsl
@@ -6,11 +6,17 @@ uniform float lodFactor;
 uniform float lodMax;
 uniform float paddingSize;
 uniform float intensityFac;
+uniform float fireflyFactor;
 
 in vec3 worldPosition;
 
 out vec4 FragColor;
 
+float brightness(vec3 c)
+{
+       return max(max(c.r, c.g), c.b);
+}
+
 vec3 octahedral_to_cubemap_proj(vec2 co)
 {
        co = co * 2.0 - 1.0;
@@ -77,7 +83,13 @@ void main() {
                        /* 
http://http.developer.nvidia.com/GPUGems3/gpugems3_ch20.html : Equation 13 */
                        float lod = clamp(lodFactor - 0.5 * log2(pdf * dist), 
0.0, lodMax) ;
 
-                       out_radiance += textureLod(probeHdr, L, lod).rgb * NL;
+                       vec3 l_col = textureLod(probeHdr, L, lod).rgb;
+
+                       /* Clamped brightness. */
+                       float luma = max(1e-8, brightness(l_col));
+                       l_col *= 1.0 - max(0.0, luma - fireflyFactor) / luma;
+
+                       out_radiance += l_col * NL;
                        weight += NL;
                }
        }
diff --git a/source/blender/makesdna/DNA_scene_types.h 
b/source/blender/makesdna/DNA_scene_types.h
index 3ad96f09555..a4ceaf04942 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -1461,7 +1461,7 @@ typedef struct SceneEEVEE {
        int gi_cubemap_resolution;
        int gi_visibility_resolution;
        float gi_irradiance_smoothing;
-       float pad;
+       float gi_glossy_clamp;
 
        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 850560646ec..23e8b13be42 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -5687,6 +5687,14 @@ static void rna_def_scene_eevee(Blender

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to