diff options
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; |