[Bf-blender-cvs] [cf8a0597693] blender2.8: Workbench: Tempural Anti Aliasing

Jeroen Bakker noreply at git.blender.org
Tue Jun 26 16:36:51 CEST 2018


Commit: cf8a0597693de8fbf3dccf607d81e6e1f2c0d2aa
Author: Jeroen Bakker
Date:   Mon Jun 25 09:06:39 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBcf8a0597693de8fbf3dccf607d81e6e1f2c0d2aa

Workbench: Tempural Anti Aliasing

- FXAA is now also done in the workbench_forward engine.
- User can enable TAA8 in the userpref by setting their max
viewport AA to TAA8. FXAA will still be used when navigating

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

M	source/blender/draw/CMakeLists.txt
A	source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl
M	source/blender/draw/engines/workbench/solid_mode.c
M	source/blender/draw/engines/workbench/workbench_data.c
M	source/blender/draw/engines/workbench/workbench_deferred.c
A	source/blender/draw/engines/workbench/workbench_effect_fxaa.c
A	source/blender/draw/engines/workbench/workbench_effect_taa.c
M	source/blender/draw/engines/workbench/workbench_forward.c
M	source/blender/draw/engines/workbench/workbench_private.h
M	source/blender/makesdna/DNA_userdef_types.h
M	source/blender/makesrna/intern/rna_userdef.c

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 2f268663186..a68ccc0da93 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -111,6 +111,8 @@ set(SRC
 	engines/workbench/workbench_data.c
 	engines/workbench/workbench_engine.c
 	engines/workbench/workbench_deferred.c
+	engines/workbench/workbench_effect_fxaa.c
+	engines/workbench/workbench_effect_taa.c
 	engines/workbench/workbench_forward.c
 	engines/workbench/workbench_materials.c
 	engines/workbench/workbench_studiolight.c
@@ -209,6 +211,7 @@ data_to_c_simple(engines/workbench/shaders/workbench_common_lib.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_data_lib.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_deferred_composite_frag.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_effect_fxaa_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_effect_taa_frag.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_forward_composite_frag.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_forward_depth_frag.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl SRC)
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl
new file mode 100644
index 00000000000..d962ffedf1f
--- /dev/null
+++ b/source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl
@@ -0,0 +1,15 @@
+uniform sampler2D historyBuffer;
+uniform sampler2D colorBuffer;
+
+out vec4 colorOutput;
+
+uniform float mixFactor;
+
+void main()
+{
+	ivec2 texel = ivec2(gl_FragCoord.xy);
+
+	vec4 history_buffer = texelFetch(historyBuffer, texel, 0);
+	vec4 color_buffer = texelFetch(colorBuffer, texel, 0);
+	colorOutput = mix(history_buffer, color_buffer, mixFactor);
+}
\ No newline at end of file
diff --git a/source/blender/draw/engines/workbench/solid_mode.c b/source/blender/draw/engines/workbench/solid_mode.c
index 1e49d1ae573..a3a42e10c8e 100644
--- a/source/blender/draw/engines/workbench/solid_mode.c
+++ b/source/blender/draw/engines/workbench/solid_mode.c
@@ -76,6 +76,12 @@ static void workbench_solid_engine_free(void)
 	workbench_deferred_engine_free();
 }
 
+static void workbench_solid_view_update(void *vedata)
+{
+	WORKBENCH_Data *data = vedata;
+	workbench_taa_view_updated(data);
+}
+
 static const DrawEngineDataSize workbench_data_size = DRW_VIEWPORT_DATA_SIZE(WORKBENCH_Data);
 
 DrawEngineType draw_engine_workbench_solid = {
@@ -89,7 +95,7 @@ DrawEngineType draw_engine_workbench_solid = {
 	&workbench_solid_cache_finish,
 	&workbench_solid_draw_background,
 	&workbench_solid_draw_scene,
-	NULL,
+	&workbench_solid_view_update,
 	NULL,
 	NULL,
 };
diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c
index d544e7614ab..a72f3a673b5 100644
--- a/source/blender/draw/engines/workbench/workbench_data.c
+++ b/source/blender/draw/engines/workbench/workbench_data.c
@@ -5,6 +5,12 @@
 #include "UI_resources.h"
 
 
+void workbench_effect_info_init(WORKBENCH_EffectInfo *effect_info)
+{
+	effect_info->jitter_index = 0;
+	effect_info->view_updated = true;
+}
+
 void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
 {
 	const DRWContextState *draw_ctx = DRW_context_state_get();
diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c
index 4fe3e92f10c..96ed345ed45 100644
--- a/source/blender/draw/engines/workbench/workbench_deferred.c
+++ b/source/blender/draw/engines/workbench/workbench_deferred.c
@@ -65,7 +65,6 @@ static struct {
 	struct GPUShader *shadow_pass_manifold_sh;
 	struct GPUShader *shadow_caps_sh;
 	struct GPUShader *shadow_caps_manifold_sh;
-	struct GPUShader *effect_fxaa_sh;
 
 	struct GPUTexture *object_id_tx; /* ref only, not alloced */
 	struct GPUTexture *color_buffer_tx; /* ref only, not alloced */
@@ -85,8 +84,6 @@ static struct {
 } e_data = {{NULL}};
 
 /* Shaders */
-extern char datatoc_common_fxaa_lib_glsl[];
-extern char datatoc_common_fullscreen_vert_glsl[];
 extern char datatoc_common_hair_lib_glsl[];
 
 extern char datatoc_workbench_prepass_vert_glsl[];
@@ -103,7 +100,6 @@ extern char datatoc_workbench_background_lib_glsl[];
 extern char datatoc_workbench_cavity_lib_glsl[];
 extern char datatoc_workbench_common_lib_glsl[];
 extern char datatoc_workbench_data_lib_glsl[];
-extern char datatoc_workbench_effect_fxaa_frag_glsl[];
 extern char datatoc_workbench_object_outline_lib_glsl[];
 extern char datatoc_workbench_world_light_lib_glsl[];
 
@@ -219,7 +215,7 @@ static void select_deferred_shaders(WORKBENCH_PrivateData *wpd)
 static float *create_disk_samples(int num_samples)
 {
 	/* vec4 to ensure memory alignment. */
-	float (*texels)[4] = MEM_mallocN(sizeof(float[4]) * num_samples, "concentric_tex");
+	float (*texels)[4] = MEM_mallocN(sizeof(float[4]) * num_samples, __func__);
 	const float num_samples_inv = 1.0f / num_samples;
 
 	for (int i = 0; i < num_samples; i++) {
@@ -272,9 +268,19 @@ void workbench_deferred_engine_init(WORKBENCH_Data *vedata)
 {
 	WORKBENCH_FramebufferList *fbl = vedata->fbl;
 	WORKBENCH_StorageList *stl = vedata->stl;
+	WORKBENCH_TextureList *txl = vedata->txl;
 	WORKBENCH_PassList *psl = vedata->psl;
 	DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
 
+	if (!stl->g_data) {
+		/* Alloc transient pointers */
+		stl->g_data = MEM_mallocN(sizeof(*stl->g_data), __func__);
+	}
+	if (!stl->effects) {
+		stl->effects = MEM_mallocN(sizeof(*stl->effects), __func__);
+		workbench_effect_info_init(stl->effects);
+	}
+
 	if (!e_data.next_object_id) {
 		memset(e_data.prepass_sh_cache,   0x00, sizeof(struct GPUShader *) * MAX_SHADERS);
 		memset(e_data.composite_sh_cache, 0x00, sizeof(struct GPUShader *) * MAX_SHADERS);
@@ -322,17 +328,10 @@ void workbench_deferred_engine_init(WORKBENCH_Data *vedata)
 		e_data.cavity_sh = DRW_shader_create_fullscreen(cavity_frag, NULL);
 		MEM_freeN(cavity_frag);
 
-		e_data.effect_fxaa_sh = DRW_shader_create_with_lib(
-		        datatoc_common_fullscreen_vert_glsl, NULL,
-		        datatoc_workbench_effect_fxaa_frag_glsl,
-		        datatoc_common_fxaa_lib_glsl,
-		        NULL);
 	}
+	workbench_fxaa_engine_init();
+	workbench_taa_engine_init(vedata);
 
-	if (!stl->g_data) {
-		/* Alloc transient pointers */
-		stl->g_data = MEM_mallocN(sizeof(*stl->g_data), __func__);
-	}
 
 	WORKBENCH_PrivateData *wpd = stl->g_data;
 	workbench_private_data_init(wpd);
@@ -424,15 +423,20 @@ void workbench_deferred_engine_init(WORKBENCH_Data *vedata)
 	}
 
 	{
-		psl->effect_fxaa_pass = DRW_pass_create("Effect FXAA", DRW_STATE_WRITE_COLOR);
-		DRWShadingGroup *grp = DRW_shgroup_create(e_data.effect_fxaa_sh, psl->effect_fxaa_pass);
-		DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", &e_data.effect_buffer_tx);
-		DRW_shgroup_uniform_vec2(grp, "invertedViewportSize", DRW_viewport_invert_size_get(), 1);
-		DRW_shgroup_call_add(grp, DRW_cache_fullscreen_quad_get(), NULL);
+		if (TAA_ENABLED(wpd)) {
+			psl->effect_aa_pass = workbench_taa_create_pass(txl, stl->effects, fbl, &e_data.composite_buffer_tx);
+		}
+		else if (FXAA_ENABLED(wpd)) {
+			psl->effect_aa_pass = workbench_fxaa_create_pass(&e_data.effect_buffer_tx);
+			stl->effects->jitter_index = 0;
+		}
+		else {
+			psl->effect_aa_pass = NULL;
+		}
 	}
 }
 
-void workbench_deferred_engine_free()
+void workbench_deferred_engine_free(void)
 {
 	for (int index = 0; index < MAX_SHADERS; index++) {
 		DRW_SHADER_FREE_SAFE(e_data.prepass_sh_cache[index]);
@@ -449,7 +453,8 @@ void workbench_deferred_engine_free()
 	DRW_SHADER_FREE_SAFE(e_data.shadow_caps_sh);
 	DRW_SHADER_FREE_SAFE(e_data.shadow_caps_manifold_sh);
 
-	DRW_SHADER_FREE_SAFE(e_data.effect_fxaa_sh);
+	workbench_fxaa_engine_free();
+	workbench_taa_engine_free();
 }
 
 static void workbench_composite_uniforms(WORKBENCH_PrivateData *wpd, DRWShadingGroup *grp)
@@ -834,7 +839,14 @@ void workbench_deferred_draw_scene(WORKBENCH_Data *vedata)
 	WORKBENCH_StorageList *stl = vedata->stl;
 	WORKBENCH_FramebufferList *fbl = vedata->fbl;
 	WORKBENCH_PrivateData *wpd = stl->g_data;
+	WORKBENCH_EffectInfo *effect_info = stl->effects;
 	DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
+	const bool taa_enabled = TAA_ENABLED(wpd);
+
+	if (taa_enabled)
+	{
+		workbench_taa_draw_scene_start(effect_info);
+	}
 
 	/* clear in background */
 	GPU_framebuffer_bind(fbl->prepass_fb);
@@ -870,21 +882,14 @@ void workbench_deferred_draw_scene(WORKBENCH_Data *vedata)
 		DRW_draw_pass(psl->composite_pass);
 	}
 
-	if (FXAA_ENABLED(wpd)) {
-		GPU_framebuffer_bind(fbl->effect_fb);
-		DRW_transform_to_display(e_data.composite_buffer_tx);
-
-		/* TODO: when rendering the fxaa pass should be done in display space
-		Currently we do not support rendering in the workbench
-		*/
-		GPU_framebuffer_bind(dfbl->color_only_fb);
-		DRW_draw_pass(psl->effect_fxaa_pass);
-	}
-	else {
-		GPU_framebuffer_bind(dfbl->color_only_fb);
-		DRW_transform_to_display(e_data.composite_buffer_tx);
+	GPUTexture *final_color_tx = e_data.composite_buffer_tx;
+	if (taa_enabled)
+	{
+		workbench_taa_draw_pass(effect_info, psl->effect_aa_pass);
+		final_color_tx = effect_info->final_color_tx;
+		workbench_taa_draw_scene_end(vedata);
 	}
 
-
+	workbench_fxaa_draw_pass(wpd, fbl->effect_fb, final_color_tx, psl->effect_aa_pass);
 	workbench_private_data_free(wpd);
 }
diff --git a/source/blender/draw/engines/workbench/workbench_effect_fxaa.c b/source/blender/draw/engines/workbench/workbench_effect_fxaa.c
new file mode 100644
index 00000000000..2746a4f14f8
--- /dev/null
+++ b/source/blender/draw/engines/workbench/workbench_effect_fxaa.c
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2016, Blender Foundation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WI

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list