[Bf-blender-cvs] [3ae0be45f1b] blender2.8: Eevee: Implement Temporal Anti Aliasing / Super Sampling

Clément Foucault noreply at git.blender.org
Mon Sep 25 20:46:51 CEST 2017


Commit: 3ae0be45f1b14a32ae85acdec92744af4d05a4a0
Author: Clément Foucault
Date:   Mon Sep 25 20:14:07 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB3ae0be45f1b14a32ae85acdec92744af4d05a4a0

Eevee: Implement Temporal Anti Aliasing / Super Sampling

This adds TAA to eevee. The only thing important to note is that we need to keep the unjittered depth buffer so that the other engines are composited correctly.

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

M	release/scripts/startup/bl_ui/properties_render.py
M	release/scripts/startup/bl_ui/properties_render_layer.py
M	source/blender/draw/CMakeLists.txt
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_lightprobes.c
M	source/blender/draw/engines/eevee/eevee_private.h
A	source/blender/draw/engines/eevee/shaders/effect_temporal_aa.glsl
M	source/blender/makesrna/intern/rna_scene.c

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

diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py
index b42aa50e00e..a1fd0b74514 100644
--- a/release/scripts/startup/bl_ui/properties_render.py
+++ b/release/scripts/startup/bl_ui/properties_render.py
@@ -735,6 +735,25 @@ class RENDER_PT_eevee_shadows(RenderButtonsPanel, Panel):
         col.prop(props, "shadow_high_bitdepth")
 
 
+class RENDER_PT_eevee_antialiasing(RenderButtonsPanel, Panel):
+    bl_label = "Viewport Anti Aliasing"
+    COMPAT_ENGINES = {'BLENDER_EEVEE'}
+
+    @classmethod
+    def poll(cls, context):
+        scene = context.scene
+        return scene and (scene.render.engine in cls.COMPAT_ENGINES)
+
+    def draw(self, context):
+        layout = self.layout
+        scene = context.scene
+        props = scene.layer_properties['BLENDER_EEVEE']
+
+        col = layout.column()
+        col.prop(props, "taa_enable")
+        col.prop(props, "taa_samples")
+
+
 classes = (
     RENDER_MT_presets,
     RENDER_MT_ffmpeg_presets,
@@ -757,6 +776,7 @@ classes = (
     RENDER_PT_eevee_poststack_settings,
     RENDER_PT_eevee_postprocess_settings,
     RENDER_PT_eevee_shadows,
+    RENDER_PT_eevee_antialiasing,
 )
 
 if __name__ == "__main__":  # only for live edit.
diff --git a/release/scripts/startup/bl_ui/properties_render_layer.py b/release/scripts/startup/bl_ui/properties_render_layer.py
index 79658051603..08d7d1f4320 100644
--- a/release/scripts/startup/bl_ui/properties_render_layer.py
+++ b/release/scripts/startup/bl_ui/properties_render_layer.py
@@ -312,6 +312,27 @@ class RENDERLAYER_PT_eevee_shadows(RenderLayerButtonsPanel, Panel):
         col.template_override_property(layer_props, scene_props, "shadow_high_bitdepth")
 
 
+class RENDERLAYER_PT_eevee_antialiasing(RenderLayerButtonsPanel, Panel):
+    bl_label = "Viewport Anti Aliasing"
+    COMPAT_ENGINES = {'BLENDER_EEVEE'}
+
+    @classmethod
+    def poll(cls, context):
+        scene = context.scene
+        return scene and (scene.render.engine in cls.COMPAT_ENGINES)
+
+    def draw(self, context):
+        layout = self.layout
+        scene = context.scene
+        scene_props = scene.layer_properties['BLENDER_EEVEE']
+        layer = bpy.context.render_layer
+        layer_props = layer.engine_overrides['BLENDER_EEVEE']
+
+        col = layout.column()
+        col.template_override_property(layer_props, scene_props, "taa_enable")
+        col.template_override_property(layer_props, scene_props, "taa_samples")
+
+
 classes = (
     RENDERLAYER_UL_renderlayers,
     RENDERLAYER_PT_layers,
@@ -323,6 +344,7 @@ classes = (
     RENDERLAYER_PT_eevee_screen_space_reflections,
     RENDERLAYER_PT_eevee_volumetric,
     RENDERLAYER_PT_eevee_shadows,
+    RENDERLAYER_PT_eevee_antialiasing,
 )
 
 if __name__ == "__main__":  # only for live edit.
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index a41ed73b143..da8c89f02a8 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -146,6 +146,7 @@ data_to_c_simple(engines/eevee/shaders/effect_gtao_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/effect_minmaxz_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/effect_motion_blur_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/effect_ssr_frag.glsl SRC)
+data_to_c_simple(engines/eevee/shaders/effect_temporal_aa.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/lightprobe_planar_downsample_frag.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/lightprobe_planar_downsample_geom.glsl SRC)
 data_to_c_simple(engines/eevee/shaders/lightprobe_planar_downsample_vert.glsl SRC)
diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c
index bcc9986d671..ac2d293292c 100644
--- a/source/blender/draw/engines/eevee/eevee_effects.c
+++ b/source/blender/draw/engines/eevee/eevee_effects.c
@@ -43,6 +43,7 @@
 #include "DEG_depsgraph.h"
 
 #include "BLI_dynstr.h"
+#include "BLI_jitter.h"
 
 #include "eevee_private.h"
 #include "GPU_texture.h"
@@ -105,8 +106,13 @@ static struct {
 	struct GPUShader *gtao_sh;
 	struct GPUShader *gtao_debug_sh;
 
+	/* Temporal Anti Aliasing */
+	struct GPUShader *taa_resolve_sh;
+
+	/* Theses are just references, not actually allocated */
 	struct GPUTexture *depth_src;
 	struct GPUTexture *color_src;
+
 	int depth_src_layer;
 	float cube_texel_size;
 } e_data = {NULL}; /* Engine data */
@@ -115,6 +121,7 @@ extern char datatoc_ambient_occlusion_lib_glsl[];
 extern char datatoc_bsdf_common_lib_glsl[];
 extern char datatoc_bsdf_sampling_lib_glsl[];
 extern char datatoc_octahedron_lib_glsl[];
+extern char datatoc_effect_temporal_aa_glsl[];
 extern char datatoc_effect_ssr_frag_glsl[];
 extern char datatoc_effect_minmaxz_frag_glsl[];
 extern char datatoc_effect_motion_blur_frag_glsl[];
@@ -256,6 +263,8 @@ void EEVEE_effects_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata)
 
 		MEM_freeN(frag_str);
 
+		e_data.taa_resolve_sh = DRW_shader_create_fullscreen(datatoc_effect_temporal_aa_glsl, NULL);
+
 		e_data.downsample_sh = DRW_shader_create_fullscreen(datatoc_effect_downsample_frag_glsl, NULL);
 		e_data.downsample_cube_sh = DRW_shader_create(datatoc_lightprobe_vert_glsl,
 		                                              datatoc_lightprobe_geom_glsl,
@@ -738,6 +747,68 @@ void EEVEE_effects_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata)
 		}
 	}
 
+	if (BKE_collection_engine_property_value_get_bool(props, "taa_enable")) {
+		float persmat[4][4], viewmat[4][4];
+
+		effects->enabled_effects |= EFFECT_TAA | EFFECT_DOUBLE_BUFFER;
+
+		/* 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);
+
+		int taa_pref_samples = BKE_collection_engine_property_value_get_int(props, "taa_samples");
+		CLAMP(taa_pref_samples, 1, 32);
+		view_is_valid = view_is_valid && (effects->taa_total_sample == taa_pref_samples);
+
+		if (effects->taa_total_sample != taa_pref_samples) {
+			effects->taa_total_sample = taa_pref_samples;
+			BLI_jitter_init(effects->taa_jit_ofs, effects->taa_total_sample);
+		}
+
+		DRW_viewport_matrix_get(persmat, DRW_MAT_PERS);
+		DRW_viewport_matrix_get(viewmat, DRW_MAT_VIEW);
+		DRW_viewport_matrix_get(effects->overide_winmat, DRW_MAT_WIN);
+		view_is_valid = view_is_valid && compare_m4m4(persmat, effects->prev_drw_persmat, 0.0001f);
+		copy_m4_m4(effects->prev_drw_persmat, persmat);
+
+
+		if (view_is_valid && (effects->taa_current_sample < effects->taa_total_sample)) {
+			effects->taa_current_sample += 1;
+
+			effects->taa_alpha = 1.0f - (1.0f / (float)(effects->taa_current_sample));
+
+			window_translate_m4(
+			        effects->overide_winmat, persmat,
+			        (effects->taa_jit_ofs[effects->taa_current_sample][0] * 2.0f) / viewport_size[0],
+			        (effects->taa_jit_ofs[effects->taa_current_sample][1] * 2.0f) / viewport_size[1]);
+
+			mul_m4_m4m4(effects->overide_persmat, effects->overide_winmat, viewmat);
+			invert_m4_m4(effects->overide_persinv, effects->overide_persmat);
+			invert_m4_m4(effects->overide_wininv, effects->overide_winmat);
+
+			DRW_viewport_matrix_override_set(effects->overide_persmat, DRW_MAT_PERS);
+			DRW_viewport_matrix_override_set(effects->overide_persinv, DRW_MAT_PERSINV);
+			DRW_viewport_matrix_override_set(effects->overide_winmat, DRW_MAT_WIN);
+			DRW_viewport_matrix_override_set(effects->overide_wininv, DRW_MAT_WININV);
+		}
+		else {
+			effects->taa_current_sample = 1;
+		}
+
+		DRWFboTexture tex_double_buffer = {&txl->depth_double_buffer, DRW_TEX_DEPTH_24};
+
+		DRW_framebuffer_init(&fbl->depth_double_buffer_fb, &draw_engine_eevee_type,
+		                    (int)viewport_size[0], (int)viewport_size[1],
+		                    &tex_double_buffer, 1);
+	}
+	else {
+		/* Cleanup to release memory */
+		DRW_TEXTURE_FREE_SAFE(txl->depth_double_buffer);
+		DRW_FRAMEBUFFER_FREE_SAFE(fbl->depth_double_buffer_fb);
+	}
+
 	/* Normal buffer for deferred passes. */
 	if ((((effects->enabled_effects & EFFECT_GTAO) != 0) && G.debug_value == 6) ||
 	    ((effects->enabled_effects & EFFECT_SSR) != 0))
@@ -800,6 +871,15 @@ void EEVEE_effects_cache_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata)
 
 	struct Gwn_Batch *quad = DRW_cache_fullscreen_quad_get();
 
+	if ((effects->enabled_effects & EFFECT_TAA) != 0) {
+		psl->taa_resolve = DRW_pass_create("Temporal AA Resolve", DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND);
+		DRWShadingGroup *grp = DRW_shgroup_create(e_data.taa_resolve_sh, psl->taa_resolve);
+
+		DRW_shgroup_uniform_buffer(grp, "colorBuffer", &effects->source_buffer);
+		DRW_shgroup_uniform_float(grp, "alpha", &effects->taa_alpha, 1);
+		DRW_shgroup_call_add(grp, quad, NULL);
+	}
+
 	if ((effects->enabled_effects & EFFECT_VOLUMETRIC) != 0) {
 		const DRWContextState *draw_ctx = DRW_context_state_get();
 		Scene *scene = draw_ctx->scene;
@@ -1381,6 +1461,29 @@ void EEVEE_draw_effects(EEVEE_Data *vedata)
 	effects->source_buffer = txl->color; /* latest updated texture */
 	effects->target_buffer = fbl->effect_fb; /* next target to render to */
 
+	/* Motion Blur */
+	if ((effects->enabled_effects & EFFECT_TAA) != 0) {
+		if (effects->taa_current_sample != 1) {
+			effects->source_buffer = txl->color_double_buffer;
+			DRW_framebuffer_bind(fbl->main);
+			DRW_draw_pass(psl->taa_resolve);
+			effects->source_buffer = txl->color;
+
+			/* Restore the depth from sample 1. */
+			DRW_framebuffer_blit(fbl->depth_double_buffer_fb, fbl->main, true);
+		}
+		else {
+			/* Save the depth buffer for the next frame.
+			 * This saves us from doing anything special
+			 * in the other mode engines. */
+			DRW_framebuffer_blit(fbl->main, fbl->depth_double_buffer_fb, true);
+		}
+
+		if (effects->taa_current_sample < effects->taa_total_sample) {
+			DRW_viewport_request_redraw();
+		}
+	}
+
 	/* Detach depth for effects to use it */
 	DRW_framebuffer_texture_detach(dtxl->depth);
 
@@ -1540,6 +1643,8 @@ void EEVEE_effects_free(void)
 	DRW_SHADER_FREE_SAFE(e_data.downsample_sh);
 	DRW_SHADER_FREE_SAFE(e_data.downsample_cube_sh)

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list