[Bf-blender-cvs] [7ebb1f2ff36] eevee-motionblur-object: EEVEE: Motion Blur: Fix missing motion vectors after first TAA sample

Clément Foucault noreply at git.blender.org
Tue Apr 14 19:09:12 CEST 2020


Commit: 7ebb1f2ff3612d2dc6c852de7bd8acd0f30ad19b
Author: Clément Foucault
Date:   Tue Mar 31 17:22:07 2020 +0200
Branches: eevee-motionblur-object
https://developer.blender.org/rB7ebb1f2ff3612d2dc6c852de7bd8acd0f30ad19b

EEVEE: Motion Blur: Fix missing motion vectors after first TAA sample

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

M	source/blender/draw/engines/eevee/eevee_data.c
M	source/blender/draw/engines/eevee/eevee_effects.c
M	source/blender/draw/engines/eevee/eevee_motion_blur.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/eevee/shaders/object_motion_vert.glsl

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

diff --git a/source/blender/draw/engines/eevee/eevee_data.c b/source/blender/draw/engines/eevee/eevee_data.c
index 6874947de55..0cdc2de953b 100644
--- a/source/blender/draw/engines/eevee/eevee_data.c
+++ b/source/blender/draw/engines/eevee/eevee_data.c
@@ -94,6 +94,8 @@ static void eevee_object_data_init(DrawData *dd)
 {
   EEVEE_ObjectEngineData *eevee_data = (EEVEE_ObjectEngineData *)dd;
   eevee_data->shadow_caster_id = -1;
+  eevee_data->curr_time = INT_MIN;
+  eevee_data->prev_time = INT_MIN;
 }
 
 EEVEE_ObjectEngineData *EEVEE_object_data_get(Object *ob)
diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c
index 2dd5f5eed4e..1a0b7c4f610 100644
--- a/source/blender/draw/engines/eevee/eevee_effects.c
+++ b/source/blender/draw/engines/eevee/eevee_effects.c
@@ -147,6 +147,8 @@ void EEVEE_effects_init(EEVEE_ViewLayerData *sldata,
 
   if (!stl->effects) {
     stl->effects = MEM_callocN(sizeof(EEVEE_EffectsInfo), "EEVEE_EffectsInfo");
+    stl->effects->current_time = INT_MIN;
+    stl->effects->past_time = INT_MIN;
   }
 
   effects = stl->effects;
@@ -505,12 +507,10 @@ static void EEVEE_velocity_resolve(EEVEE_Data *vedata)
   EEVEE_FramebufferList *fbl = vedata->fbl;
   EEVEE_StorageList *stl = vedata->stl;
   EEVEE_EffectsInfo *effects = stl->effects;
-  struct DRWView *view = effects->taa_view;
 
   if ((effects->enabled_effects & EFFECT_VELOCITY_BUFFER) != 0) {
     DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
     e_data.depth_src = dtxl->depth;
-    DRW_view_persmat_get(view, effects->velocity_curr_persinv, true);
 
     GPU_framebuffer_bind(fbl->velocity_resolve_fb);
     DRW_draw_pass(psl->velocity_resolve);
@@ -520,7 +520,6 @@ static void EEVEE_velocity_resolve(EEVEE_Data *vedata)
       DRW_draw_pass(psl->velocity_object);
     }
   }
-  DRW_view_persmat_get(view, effects->velocity_past_persmat, false);
 }
 
 void EEVEE_draw_effects(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
diff --git a/source/blender/draw/engines/eevee/eevee_motion_blur.c b/source/blender/draw/engines/eevee/eevee_motion_blur.c
index 4a494896e64..530dd38d596 100644
--- a/source/blender/draw/engines/eevee/eevee_motion_blur.c
+++ b/source/blender/draw/engines/eevee/eevee_motion_blur.c
@@ -50,12 +50,16 @@ static struct {
 extern char datatoc_effect_motion_blur_frag_glsl[];
 extern char datatoc_object_motion_frag_glsl[];
 extern char datatoc_object_motion_vert_glsl[];
+extern char datatoc_common_view_lib_glsl[];
 
 static void eevee_create_shader_motion_blur(void)
 {
   e_data.motion_blur_sh = DRW_shader_create_fullscreen(datatoc_effect_motion_blur_frag_glsl, NULL);
-  e_data.motion_blur_object_sh = DRW_shader_create(
-      datatoc_object_motion_vert_glsl, NULL, datatoc_object_motion_frag_glsl, NULL);
+  e_data.motion_blur_object_sh = DRW_shader_create_with_lib(datatoc_object_motion_vert_glsl,
+                                                            NULL,
+                                                            datatoc_object_motion_frag_glsl,
+                                                            datatoc_common_view_lib_glsl,
+                                                            NULL);
 }
 
 static void eevee_motion_blur_past_persmat_get(const CameraParams *past_params,
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index 89458062215..06348c153d2 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -624,8 +624,6 @@ typedef struct EEVEE_EffectsInfo {
   float past_time;
   bool cam_params_init;
   /* Velocity Pass */
-  float velocity_curr_persinv[4][4];
-  float velocity_past_persmat[4][4];
   struct GPUTexture *velocity_tx; /* Texture from pool */
   /* Depth Of Field */
   float dof_near_far[2];
diff --git a/source/blender/draw/engines/eevee/shaders/object_motion_vert.glsl b/source/blender/draw/engines/eevee/shaders/object_motion_vert.glsl
index 66a65c5404f..83f3925c34c 100644
--- a/source/blender/draw/engines/eevee/shaders/object_motion_vert.glsl
+++ b/source/blender/draw/engines/eevee/shaders/object_motion_vert.glsl
@@ -14,5 +14,7 @@ void main()
 {
   prevWorldPos = (prevModelMatrix * vec4(pos, 1.0)).xyz;
   currWorldPos = (currModelMatrix * vec4(pos, 1.0)).xyz;
-  gl_Position = currViewProjectionMatrix * vec4(currWorldPos, 1.0);
+  /* Use jittered projmatrix to be able to match exact sample depth (depth equal test).
+   * Note that currModelMatrix needs to also be equal to ModelMatrix for the samples to match. */
+  gl_Position = ViewProjectionMatrix * vec4(currWorldPos, 1.0);
 }



More information about the Bf-blender-cvs mailing list