diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2020-06-23 14:59:55 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2020-06-23 15:04:41 +0300 |
commit | 439b40e601f8cdae9a12fc3f503e9e6acdd596d5 (patch) | |
tree | 9a485ec18d1c9dd030ffdfe9309193adc96dc515 /source/blender/draw/engines/eevee/eevee_data.c | |
parent | cc3e808ab47887c002faaa8a28318a2b4f47e02a (diff) |
EEVEE: Motion Blur: Add accumulation motion blur for better precision
This revisit the render pipeline to support time slicing for better motion
blur.
We support accumulation with or without the Post-process motion blur.
If using the post-process, we reuse last step next motion data to avoid
another scene reevaluation.
This also adds support for hair motion blur which is handled in a similar
way as mesh motion blur.
The total number of samples is distributed evenly accross all timesteps to
avoid sampling weighting issues. For this reason, the sample count is
(internally) rounded up to the next multiple of the step count.
Only FX Motion BLur: {F8632258}
FX Motion Blur + 4 time steps: {F8632260}
FX Motion Blur + 32 time steps: {F8632261}
Reviewed By: jbakker
Differential Revision: https://developer.blender.org/D8079
Diffstat (limited to 'source/blender/draw/engines/eevee/eevee_data.c')
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_data.c | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_data.c b/source/blender/draw/engines/eevee/eevee_data.c index 5ca24d296c5..a4aa0e10198 100644 --- a/source/blender/draw/engines/eevee/eevee_data.c +++ b/source/blender/draw/engines/eevee/eevee_data.c @@ -41,8 +41,19 @@ static void eevee_motion_blur_mesh_data_free(void *val) { EEVEE_GeometryMotionData *geom_mb = (EEVEE_GeometryMotionData *)val; - for (int i = 0; i < ARRAY_SIZE(geom_mb->vbo); i++) { - GPU_VERTBUF_DISCARD_SAFE(geom_mb->vbo[i]); + switch (geom_mb->type) { + case EEVEE_HAIR_GEOM_MOTION_DATA: + for (int i = 0; i < ARRAY_SIZE(geom_mb->vbo); i++) { + GPU_VERTBUF_DISCARD_SAFE(geom_mb->hair_pos[i]); + DRW_TEXTURE_FREE_SAFE(geom_mb->hair_pos_tx[i]); + } + break; + + case EEVEE_MESH_GEOM_MOTION_DATA: + for (int i = 0; i < ARRAY_SIZE(geom_mb->vbo); i++) { + GPU_VERTBUF_DISCARD_SAFE(geom_mb->vbo[i]); + } + break; } MEM_freeN(val); } @@ -103,14 +114,17 @@ void EEVEE_motion_blur_data_free(EEVEE_MotionBlurData *mb) } } -EEVEE_ObjectMotionData *EEVEE_motion_blur_object_data_get(EEVEE_MotionBlurData *mb, Object *ob) +EEVEE_ObjectMotionData *EEVEE_motion_blur_object_data_get(EEVEE_MotionBlurData *mb, + Object *ob, + bool hair) { if (mb->object == NULL) { return NULL; } EEVEE_ObjectKey key, *key_p; - key.ob = ob; + /* Small hack to avoid another comparisson. */ + key.ob = (Object *)((char *)ob + hair); DupliObject *dup = DRW_object_get_dupli(ob); if (dup) { key.parent = DRW_object_get_dupli_parent(ob); @@ -133,7 +147,9 @@ EEVEE_ObjectMotionData *EEVEE_motion_blur_object_data_get(EEVEE_MotionBlurData * return ob_step; } -EEVEE_GeometryMotionData *EEVEE_motion_blur_geometry_data_get(EEVEE_MotionBlurData *mb, Object *ob) +EEVEE_GeometryMotionData *EEVEE_motion_blur_geometry_data_get(EEVEE_MotionBlurData *mb, + Object *ob, + bool hair) { if (mb->geom == NULL) { return NULL; @@ -142,10 +158,12 @@ EEVEE_GeometryMotionData *EEVEE_motion_blur_geometry_data_get(EEVEE_MotionBlurDa /* Use original data as key to ensure matching accross update. */ Object *ob_orig = DEG_get_original_object(ob); - EEVEE_GeometryMotionData *geom_step = BLI_ghash_lookup(mb->geom, ob_orig->data); + void *key = (char *)ob_orig->data + hair; + EEVEE_GeometryMotionData *geom_step = BLI_ghash_lookup(mb->geom, key); if (geom_step == NULL) { geom_step = MEM_callocN(sizeof(EEVEE_GeometryMotionData), __func__); - BLI_ghash_insert(mb->geom, ob_orig->data, geom_step); + geom_step->type = (hair) ? EEVEE_HAIR_GEOM_MOTION_DATA : EEVEE_MESH_GEOM_MOTION_DATA; + BLI_ghash_insert(mb->geom, key, geom_step); } return geom_step; @@ -229,6 +247,8 @@ static void eevee_object_data_init(DrawData *dd) { EEVEE_ObjectEngineData *eevee_data = (EEVEE_ObjectEngineData *)dd; eevee_data->shadow_caster_id = -1; + eevee_data->need_update = false; + eevee_data->geom_update = false; } EEVEE_ObjectEngineData *EEVEE_object_data_get(Object *ob) |