[Bf-blender-cvs] [2218b61e8ea] blender-v2.90-release: Fix T79637 Motion blur gives artifacts when changing the camera

Clément Foucault noreply at git.blender.org
Wed Aug 12 18:07:02 CEST 2020


Commit: 2218b61e8ea76b6cf139b3ba76e430f60d691211
Author: Clément Foucault
Date:   Wed Aug 12 18:04:08 2020 +0200
Branches: blender-v2.90-release
https://developer.blender.org/rB2218b61e8ea76b6cf139b3ba76e430f60d691211

Fix T79637 Motion blur gives artifacts when changing the camera

DRW_render_set_time is calling RE_engine_frame_set will in turn calls
BKE_scene_camera_switch_update.

To workaround this, we get the original camera object at render init and
get the evaluated version from it after each time change.

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

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

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

diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index a88eccc89a9..8d11a3e5dc1 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -920,6 +920,9 @@ typedef struct EEVEE_PrivateData {
   float camtexcofac[4];
   float size_orig[2];
 
+  /* Cached original camera when rendering for motion blur (see T79637). */
+  struct Object *cam_original_ob;
+
   /* Mist Settings */
   float mist_start, mist_inv_dist, mist_falloff;
 
diff --git a/source/blender/draw/engines/eevee/eevee_render.c b/source/blender/draw/engines/eevee/eevee_render.c
index b6b8833b1da..3a99bd1b18e 100644
--- a/source/blender/draw/engines/eevee/eevee_render.c
+++ b/source/blender/draw/engines/eevee/eevee_render.c
@@ -124,6 +124,9 @@ bool EEVEE_render_init(EEVEE_Data *ved, RenderEngine *engine, struct Depsgraph *
   GPU_framebuffer_ensure_config(&fbl->main_color_fb,
                                 {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(txl->color)});
 
+  /* Camera could change because of Motion blur. */
+  g_data->cam_original_ob = RE_GetCamera(engine->re);
+
   return true;
 }
 
@@ -133,9 +136,10 @@ void EEVEE_render_modules_init(EEVEE_Data *vedata,
 {
   EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
   EEVEE_StorageList *stl = vedata->stl;
+  EEVEE_PrivateData *g_data = vedata->stl->g_data;
   EEVEE_FramebufferList *fbl = vedata->fbl;
   /* TODO(sergey): Shall render hold pointer to an evaluated camera instead? */
-  struct Object *ob_camera_eval = DEG_get_evaluated_object(depsgraph, RE_GetCamera(engine->re));
+  struct Object *ob_camera_eval = DEG_get_evaluated_object(depsgraph, g_data->cam_original_ob);
   EEVEE_render_view_sync(vedata, engine, depsgraph);
 
   /* `EEVEE_renderpasses_init` will set the active render passes used by `EEVEE_effects_init`.
@@ -154,7 +158,7 @@ void EEVEE_render_view_sync(EEVEE_Data *vedata, RenderEngine *engine, struct Dep
   /* Set the pers & view matrix. */
   float winmat[4][4], viewmat[4][4], viewinv[4][4];
   /* TODO(sergey): Shall render hold pointer to an evaluated camera instead? */
-  struct Object *ob_camera_eval = DEG_get_evaluated_object(depsgraph, RE_GetCamera(engine->re));
+  struct Object *ob_camera_eval = DEG_get_evaluated_object(depsgraph, g_data->cam_original_ob);
 
   RE_GetCameraWindow(engine->re, ob_camera_eval, winmat);
   RE_GetCameraWindowWithOverscan(engine->re, g_data->overscan, winmat);



More information about the Bf-blender-cvs mailing list