[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