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:
-rw-r--r--source/blender/draw/engines/eevee/eevee_engine.c10
-rw-r--r--source/blender/draw/engines/eevee/eevee_private.h1
-rw-r--r--source/blender/draw/engines/eevee/eevee_render.c32
-rw-r--r--source/blender/draw/engines/eevee/eevee_screen_raytrace.c6
4 files changed, 41 insertions, 8 deletions
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;