[Bf-blender-cvs] [73d2e6f2021] blender2.8: Eevee: TAA Reprojection: Initial implementation

Clément Foucault noreply at git.blender.org
Fri Apr 20 18:30:25 CEST 2018


Commit: 73d2e6f2021e649a1bf8952c37ce870562a884e4
Author: Clément Foucault
Date:   Fri Apr 20 18:24:14 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB73d2e6f2021e649a1bf8952c37ce870562a884e4

Eevee: TAA Reprojection: Initial implementation

This "improve" the viewport experience by reducing the noise from random
sampling effects (SSAO, Contact Shadows, SSR) when moving the viewport or
during playback.

This does not do Anti Aliasing because this would conflict with the outline
pass. We could enable AA jittering in "only render" mode though.

There are many things to improve but this is a solid basis to build upon.

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

M	source/blender/draw/engines/eevee/eevee_effects.c
M	source/blender/draw/engines/eevee/eevee_engine.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/eevee/eevee_temporal_sampling.c
M	source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
M	source/blender/draw/engines/eevee/shaders/effect_temporal_aa.glsl

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

diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c
index 14924345d3e..ccb61d3e328 100644
--- a/source/blender/draw/engines/eevee/eevee_effects.c
+++ b/source/blender/draw/engines/eevee/eevee_effects.c
@@ -250,6 +250,22 @@ void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object
 		effects->velocity_tx = NULL;
 	}
 
+	/**
+	 * Setup depth double buffer.
+	 */
+	if ((effects->enabled_effects & EFFECT_DEPTH_DOUBLE_BUFFER) != 0) {
+		DRW_texture_ensure_fullscreen_2D(&txl->depth_double_buffer, DRW_TEX_DEPTH_24_STENCIL_8, 0);
+
+		GPU_framebuffer_ensure_config(&fbl->double_buffer_depth_fb, {
+			GPU_ATTACHMENT_TEXTURE(txl->depth_double_buffer)
+		});
+	}
+	else {
+		/* Cleanup to release memory */
+		DRW_TEXTURE_FREE_SAFE(txl->depth_double_buffer);
+		GPU_FRAMEBUFFER_FREE_SAFE(fbl->double_buffer_depth_fb);
+	}
+
 	/**
 	 * Setup double buffer so we can access last frame as it was before post processes.
 	 */
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index be9a9fa157a..2c459f5ae3b 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -204,12 +204,18 @@ static void eevee_draw_background(void *vedata)
 		double offset[3] = {0.0, 0.0, 0.0};
 		double r[3];
 
+		bool taa_use_reprojection = (stl->effects->enabled_effects & EFFECT_TAA_REPROJECT) != 0;
+
 		if (DRW_state_is_image_render() ||
+			taa_use_reprojection ||
 		    ((stl->effects->enabled_effects & EFFECT_TAA) != 0))
 		{
-			BLI_halton_3D(primes, offset, stl->effects->taa_current_sample, r);
+			int samp = taa_use_reprojection
+			            ? stl->effects->taa_reproject_sample + 1
+			            : stl->effects->taa_current_sample;
+			BLI_halton_3D(primes, offset, samp, r);
 			EEVEE_update_noise(psl, fbl, r);
-			EEVEE_volumes_set_jitter(sldata, stl->effects->taa_current_sample - 1);
+			EEVEE_volumes_set_jitter(sldata, samp - 1);
 			EEVEE_materials_init(sldata, stl, fbl);
 		}
 		/* Copy previous persmat to UBO data */
@@ -217,7 +223,8 @@ static void eevee_draw_background(void *vedata)
 
 		if (((stl->effects->enabled_effects & EFFECT_TAA) != 0) &&
 		    (stl->effects->taa_current_sample > 1) &&
-		    !DRW_state_is_image_render())
+		    !DRW_state_is_image_render() &&
+		    !taa_use_reprojection)
 		{
 			DRW_viewport_matrix_override_set(stl->effects->overide_persmat, DRW_MAT_PERS);
 			DRW_viewport_matrix_override_set(stl->effects->overide_persinv, DRW_MAT_PERSINV);
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index 07624100ea7..9c4d7d65ccd 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -483,6 +483,8 @@ typedef enum EEVEE_EffectsFlag {
 	EFFECT_NORMAL_BUFFER       = (1 << 10), /* Not really an effect but a feature */
 	EFFECT_SSS                 = (1 << 11),
 	EFFECT_VELOCITY_BUFFER     = (1 << 12), /* Not really an effect but a feature */
+	EFFECT_TAA_REPROJECT       = (1 << 13), /* should be mutually exclusive with EFFECT_TAA */
+	EFFECT_DEPTH_DOUBLE_BUFFER = (1 << 14), /* Not really an effect but a feature */
 } EEVEE_EffectsFlag;
 
 typedef struct EEVEE_EffectsInfo {
@@ -506,6 +508,7 @@ typedef struct EEVEE_EffectsInfo {
 	struct GPUTexture *ssr_hit_output;
 	struct GPUTexture *ssr_pdf_output;
 	/* Temporal Anti Aliasing */
+	int taa_reproject_sample;
 	int taa_current_sample;
 	int taa_render_sample;
 	int taa_total_sample;
diff --git a/source/blender/draw/engines/eevee/eevee_temporal_sampling.c b/source/blender/draw/engines/eevee/eevee_temporal_sampling.c
index acc1bff6331..06f6293240d 100644
--- a/source/blender/draw/engines/eevee/eevee_temporal_sampling.c
+++ b/source/blender/draw/engines/eevee/eevee_temporal_sampling.c
@@ -27,7 +27,10 @@
 
 #include "DRW_render.h"
 
+#include "ED_screen.h"
+
 #include "BLI_rand.h"
+#include "BLI_string_utils.h"
 
 #include "eevee_private.h"
 #include "GPU_texture.h"
@@ -37,16 +40,29 @@
 static struct {
 	/* Temporal Anti Aliasing */
 	struct GPUShader *taa_resolve_sh;
+	struct GPUShader *taa_resolve_reproject_sh;
 
 	/* Pixel filter table: Only blackman-harris for now. */
 	float inverted_cdf[FILTER_CDF_TABLE_SIZE];
 } e_data = {NULL}; /* Engine data */
 
+extern char datatoc_common_uniforms_lib_glsl[];
+extern char datatoc_common_view_lib_glsl[];
+extern char datatoc_bsdf_common_lib_glsl[];
 extern char datatoc_effect_temporal_aa_glsl[];
 
 static void eevee_create_shader_temporal_sampling(void)
 {
-	e_data.taa_resolve_sh = DRW_shader_create_fullscreen(datatoc_effect_temporal_aa_glsl, NULL);
+	char *frag_str = BLI_string_joinN(
+	        datatoc_common_uniforms_lib_glsl,
+	        datatoc_common_view_lib_glsl,
+	        datatoc_bsdf_common_lib_glsl,
+	        datatoc_effect_temporal_aa_glsl);
+
+	e_data.taa_resolve_sh = DRW_shader_create_fullscreen(frag_str, NULL);
+	e_data.taa_resolve_reproject_sh = DRW_shader_create_fullscreen(frag_str, "#define USE_REPROJECTION\n");
+
+	MEM_freeN(frag_str);
 }
 
 static float UNUSED_FUNCTION(filter_box)(float UNUSED(x))
@@ -163,6 +179,11 @@ int EEVEE_temporal_sampling_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data
 	EEVEE_TextureList *txl = vedata->txl;
 	EEVEE_EffectsInfo *effects = stl->effects;
 
+	if (!e_data.taa_resolve_sh) {
+		eevee_create_shader_temporal_sampling();
+		eevee_create_cdf_table_temporal_sampling();
+	}
+
 	/* Reset for each "redraw". When rendering using ogl render,
 	 * we accumulate the redraw inside the drawing loop in eevee_draw_background().
 	 * But we do NOT accumulate between "redraw" (as in full draw manager drawloop)
@@ -173,6 +194,14 @@ int EEVEE_temporal_sampling_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data
 	ViewLayer *view_layer = draw_ctx->view_layer;
 	IDProperty *props = BKE_view_layer_engine_evaluated_get(view_layer, COLLECTION_MODE_NONE, RE_engine_id_BLENDER_EEVEE);
 
+	int repro_flag = 0;
+	if (!DRW_state_is_image_render() &&
+		BKE_collection_engine_property_value_get_bool(props, "taa_reprojection"))
+	{
+		repro_flag = EFFECT_TAA_REPROJECT | EFFECT_VELOCITY_BUFFER | EFFECT_DEPTH_DOUBLE_BUFFER | EFFECT_DOUBLE_BUFFER | EFFECT_POST_BUFFER;
+		effects->taa_reproject_sample = ((effects->taa_reproject_sample + 1) % 16);
+	}
+
 	if ((BKE_collection_engine_property_value_get_int(props, "taa_samples") != 1 &&
 	    /* FIXME the motion blur camera evaluation is tagging view_updated
 	     * thus making the TAA always reset and never stopping rendering. */
@@ -181,17 +210,17 @@ int EEVEE_temporal_sampling_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data
 	{
 		float persmat[4][4], viewmat[4][4];
 
-		if (!e_data.taa_resolve_sh) {
-			eevee_create_shader_temporal_sampling();
-			eevee_create_cdf_table_temporal_sampling();
-		}
-
 		/* Until we support reprojection, we need to make sure
 		 * that the history buffer contains correct information. */
 		bool view_is_valid = stl->g_data->valid_double_buffer;
 
 		view_is_valid = view_is_valid && (stl->g_data->view_updated == false);
 
+		if (draw_ctx->evil_C != NULL) {
+			struct wmWindowManager *wm = CTX_wm_manager(draw_ctx->evil_C);
+			view_is_valid = view_is_valid && (ED_screen_animation_no_scrub(wm) == NULL);
+		}
+
 		effects->taa_total_sample = BKE_collection_engine_property_value_get_int(props, "taa_samples");
 		MAX2(effects->taa_total_sample, 0);
 
@@ -215,6 +244,7 @@ int EEVEE_temporal_sampling_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data
 				/* OGL render already jitter the camera. */
 				if (!DRW_state_is_image_render()) {
 					effects->taa_current_sample += 1;
+					repro_flag = 0;
 
 					double ht_point[2];
 					double ht_offset[2] = {0.0, 0.0};
@@ -238,42 +268,54 @@ int EEVEE_temporal_sampling_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data
 			effects->taa_current_sample = 1;
 		}
 
-		DRW_texture_ensure_fullscreen_2D(&txl->depth_double_buffer, DRW_TEX_DEPTH_24_STENCIL_8, 0);
-
-		GPU_framebuffer_ensure_config(&fbl->double_buffer_depth_fb, {
-			GPU_ATTACHMENT_TEXTURE(txl->depth_double_buffer)
-		});
-
-		return EFFECT_TAA | EFFECT_DOUBLE_BUFFER | EFFECT_POST_BUFFER;
+		return repro_flag | EFFECT_TAA | EFFECT_DOUBLE_BUFFER | EFFECT_DEPTH_DOUBLE_BUFFER | EFFECT_POST_BUFFER;
 	}
 
 	effects->taa_current_sample = 1;
 
-	/* Cleanup to release memory */
-	DRW_TEXTURE_FREE_SAFE(txl->depth_double_buffer);
-	GPU_FRAMEBUFFER_FREE_SAFE(fbl->double_buffer_depth_fb);
-
-	return 0;
+	return repro_flag;
 }
 
-void EEVEE_temporal_sampling_cache_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata)
+void EEVEE_temporal_sampling_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
 {
 	EEVEE_PassList *psl = vedata->psl;
 	EEVEE_StorageList *stl = vedata->stl;
 	EEVEE_TextureList *txl = vedata->txl;
 	EEVEE_EffectsInfo *effects = stl->effects;
 
-	if ((effects->enabled_effects & EFFECT_TAA) != 0) {
+	if ((effects->enabled_effects & (EFFECT_TAA | EFFECT_TAA_REPROJECT)) != 0) {
+		struct GPUShader *sh = (effects->enabled_effects & EFFECT_TAA_REPROJECT)
+		                        ? e_data.taa_resolve_reproject_sh
+		                        : e_data.taa_resolve_sh;
+
 		psl->taa_resolve = DRW_pass_create("Temporal AA Resolve", DRW_STATE_WRITE_COLOR);
-		DRWShadingGroup *grp = DRW_shgroup_create(e_data.taa_resolve_sh, psl->taa_resolve);
+		DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->taa_resolve);
 
-		DRW_shgroup_uniform_texture_ref(grp, "historyBuffer", &txl->color_double_buffer);
+		DRW_shgroup_uniform_texture_ref(grp, "colorHistoryBuffer", &txl->color_double_buffer);
 		DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", &txl->color);
-		DRW_shgroup_uniform_float(grp, "alpha", &effects->taa_alpha, 1);
+
+		if (effects->enabled_effects & EFFECT_TAA_REPROJECT) {
+			DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+			DRW_shgroup_uniform_texture_ref(grp, "velocityBuffer", &effects->velocity_tx);
+			DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo);
+		}
+		else {
+			DRW_shgroup_uniform_float(grp, "alpha", &effects->taa_alpha, 1);
+		}
 		DRW_shgroup_call_add(grp, DRW_cache_fullscreen_q

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list