[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