[Bf-blender-cvs] [484794ce674] master: Eevee: Fix first sample being accumulated without SSR

Clément Foucault noreply at git.blender.org
Tue Jul 9 14:35:19 CEST 2019


Commit: 484794ce6747068f898273328138fb96c263feac
Author: Clément Foucault
Date:   Tue Jul 9 14:34:38 2019 +0200
Branches: master
https://developer.blender.org/rB484794ce6747068f898273328138fb96c263feac

Eevee: Fix first sample being accumulated without SSR

We check if the previous iteration (sample) was using a valid double buffer.
If it wasn't, we request another iteration.

This fix the issue for viewport,viewport render and image render.

Related to T65761 Eevee render inconsistency between 3D View, Viewport render, and F12 Render

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

M	source/blender/draw/engines/eevee/eevee_engine.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/eevee/eevee_render.c
M	source/blender/draw/engines/eevee/eevee_screen_raytrace.c

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

diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index 99be7ec631c..b36ad540ef9 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -303,6 +303,16 @@ static void eevee_draw_background(void *vedata)
     DRW_stats_group_end();
 
     DRW_view_set_active(NULL);
+
+    if (DRW_state_is_image_render() && (stl->effects->enabled_effects & EFFECT_SSR) &&
+        !stl->effects->ssr_was_valid_double_buffer) {
+      /* SSR needs one iteration to start properly. */
+      loop_len++;
+      /* Reset sampling (and accumulation) after the first sample to avoid
+       * washed out first bounce for SSR. */
+      EEVEE_temporal_sampling_reset(vedata);
+      stl->effects->ssr_was_valid_double_buffer = stl->g_data->valid_double_buffer;
+    }
   }
 
   /* Tonemapping and transfer result to default framebuffer. */
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index 93a4e43d3af..bd08a61e3b8 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -562,6 +562,7 @@ typedef struct EEVEE_EffectsInfo {
   /* SSR */
   bool reflection_trace_full;
   bool ssr_was_persp;
+  bool ssr_was_valid_double_buffer;
   int ssr_neighbor_ofs;
   int ssr_halfres_ofs[2];
   struct GPUTexture *ssr_normal_input; /* Textures from pool */
diff --git a/source/blender/draw/engines/eevee/eevee_render.c b/source/blender/draw/engines/eevee/eevee_render.c
index 2afd0b1d313..286bcd8f738 100644
--- a/source/blender/draw/engines/eevee/eevee_render.c
+++ b/source/blender/draw/engines/eevee/eevee_render.c
@@ -536,6 +536,11 @@ void EEVEE_render_draw(EEVEE_Data *vedata, RenderEngine *engine, RenderLayer *rl
     return;
   }
 
+  /* SSR needs one iteration to start properly. */
+  if (stl->effects->enabled_effects & EFFECT_SSR) {
+    tot_sample += 1;
+  }
+
   while (render_samples < tot_sample && !RE_engine_test_break(engine)) {
     float clear_col[4] = {0.0f, 0.0f, 0.0f, 0.0f};
     float clear_depth = 1.0f;
@@ -544,6 +549,25 @@ void EEVEE_render_draw(EEVEE_Data *vedata, RenderEngine *engine, RenderLayer *rl
     double offset[3] = {0.0, 0.0, 0.0};
     double r[3];
 
+    if ((stl->effects->enabled_effects & EFFECT_SSR) && (render_samples == 1) &&
+        !stl->effects->ssr_was_valid_double_buffer) {
+      /* SSR needs one iteration to start properly.
+       * This iteration was done, reset to the original target sample count. */
+      render_samples--;
+      tot_sample--;
+      /* Reset sampling (and accumulation) after the first sample to avoid
+       * washed out first bounce for SSR. */
+      EEVEE_temporal_sampling_reset(vedata);
+      stl->effects->ssr_was_valid_double_buffer = stl->g_data->valid_double_buffer;
+    }
+    /* Don't print every samples as it can lead to bad performance. (see T59649) */
+    else if ((render_samples % 25) == 0 || (render_samples + 1) == tot_sample) {
+      char info[42];
+      BLI_snprintf(
+          info, sizeof(info), "Rendering %u / %u samples", render_samples + 1, tot_sample);
+      RE_engine_update_stats(engine, NULL, info);
+    }
+
     /* Copy previous persmat to UBO data */
     copy_m4_m4(sldata->common_data.prev_persmat, stl->effects->prev_persmat);
 
@@ -557,14 +581,6 @@ void EEVEE_render_draw(EEVEE_Data *vedata, RenderEngine *engine, RenderLayer *rl
     EEVEE_lightprobes_refresh(sldata, vedata);
     EEVEE_lightprobes_refresh_planar(sldata, vedata);
 
-    /* Don't print every samples as it can lead to bad performance. (see T59649) */
-    if ((render_samples % 25) == 0 || (render_samples + 1) == tot_sample) {
-      char info[42];
-      BLI_snprintf(
-          info, sizeof(info), "Rendering %u / %u samples", render_samples + 1, tot_sample);
-      RE_engine_update_stats(engine, NULL, info);
-    }
-
     /* Refresh Shadows */
     EEVEE_lights_update(sldata, vedata);
     EEVEE_draw_shadows(sldata, vedata, stl->effects->taa_view);
diff --git a/source/blender/draw/engines/eevee/eevee_screen_raytrace.c b/source/blender/draw/engines/eevee/eevee_screen_raytrace.c
index 7b80daf8ed6..7b470f9c42a 100644
--- a/source/blender/draw/engines/eevee/eevee_screen_raytrace.c
+++ b/source/blender/draw/engines/eevee/eevee_screen_raytrace.c
@@ -135,6 +135,12 @@ int EEVEE_screen_raytrace_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
       stl->g_data->valid_double_buffer = false;
     }
 
+    if (!effects->ssr_was_valid_double_buffer) {
+      DRW_viewport_request_redraw();
+      EEVEE_temporal_sampling_reset(vedata);
+    }
+    effects->ssr_was_valid_double_buffer = stl->g_data->valid_double_buffer;
+
     effects->reflection_trace_full = (scene_eval->eevee.flag & SCE_EEVEE_SSR_HALF_RESOLUTION) == 0;
     common_data->ssr_thickness = scene_eval->eevee.ssr_thickness;
     common_data->ssr_border_fac = scene_eval->eevee.ssr_border_fade;



More information about the Bf-blender-cvs mailing list