[Bf-blender-cvs] [a102b7ebe5f] tmp-workbench-rewrite: Workbench: Refactor: Add outline support
Clément Foucault
noreply at git.blender.org
Tue Mar 3 17:36:11 CET 2020
Commit: a102b7ebe5f15b37622b603e3c92199a58c592e0
Author: Clément Foucault
Date: Tue Mar 3 02:29:05 2020 +0100
Branches: tmp-workbench-rewrite
https://developer.blender.org/rBa102b7ebe5f15b37622b603e3c92199a58c592e0
Workbench: Refactor: Add outline support
===================================================================
M source/blender/draw/CMakeLists.txt
M source/blender/draw/engines/workbench/shaders/workbench_curvature_lib.glsl
M source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
A source/blender/draw/engines/workbench/shaders/workbench_effect_outline_frag.glsl
M source/blender/draw/engines/workbench/workbench_data.c
M source/blender/draw/engines/workbench/workbench_effect_cavity.c
A source/blender/draw/engines/workbench/workbench_effect_outline.c
M source/blender/draw/engines/workbench/workbench_engine.c
M source/blender/draw/engines/workbench/workbench_opaque.c
M source/blender/draw/engines/workbench/workbench_private.h
M source/blender/draw/engines/workbench/workbench_shader.c
===================================================================
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 692dc300d89..a25dbcf4721 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -104,6 +104,7 @@ set(SRC
engines/workbench/workbench_effect_cavity.c
engines/workbench/workbench_effect_dof.c
engines/workbench/workbench_effect_fxaa.c
+ engines/workbench/workbench_effect_outline.c
engines/workbench/workbench_effect_taa.c
engines/workbench/workbench_engine.c
engines/workbench/workbench_forward.c
@@ -255,6 +256,7 @@ data_to_c_simple(engines/workbench/shaders/workbench_composite_frag.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_deferred_background_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_effect_outline_frag.glsl SRC)
data_to_c_simple(engines/workbench/shaders/workbench_effect_cavity_frag.glsl SRC)
data_to_c_simple(engines/workbench/shaders/workbench_effect_dof_frag.glsl SRC)
data_to_c_simple(engines/workbench/shaders/workbench_effect_fxaa_frag.glsl SRC)
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_curvature_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_curvature_lib.glsl
index 8754b7147d9..e6bc4c7bbc6 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_curvature_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_curvature_lib.glsl
@@ -16,7 +16,7 @@ void curvature_compute(vec2 uv,
{
curvature = 0.0;
- vec3 offset = vec3(world_data.viewport_size_inv, 0.0) * world_data.curvature_offset;
+ vec3 offset = vec3(world_data.viewport_size_inv, 0.0) * world_data.ui_scale;
uint object_up = texture(objectIdBuffer, uv + offset.zy).r;
uint object_down = texture(objectIdBuffer, uv - offset.zy).r;
uint object_right = texture(objectIdBuffer, uv + offset.xz).r;
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
index 69aadabe860..14758a62da7 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
@@ -29,7 +29,7 @@ struct WorldData {
float curvature_ridge;
float curvature_valley;
- float curvature_offset;
+ float ui_scale;
int matcap_orientation;
};
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_effect_outline_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_effect_outline_frag.glsl
new file mode 100644
index 00000000000..fb6fdb93462
--- /dev/null
+++ b/source/blender/draw/engines/workbench/shaders/workbench_effect_outline_frag.glsl
@@ -0,0 +1,24 @@
+
+#pragma BLENDER_REQUIRE(workbench_data_lib.glsl)
+
+uniform usampler2D objectIdBuffer;
+
+in vec4 uvcoordsvar;
+
+out vec4 fragColor;
+
+void main()
+{
+ vec3 offset = vec3(world_data.viewport_size_inv, 0.0) * world_data.ui_scale;
+ vec2 uv = uvcoordsvar.st;
+
+ uint center_id = texture(objectIdBuffer, uv).r;
+ uvec4 adjacent_ids = uvec4(texture(objectIdBuffer, uv + offset.zy).r,
+ texture(objectIdBuffer, uv - offset.zy).r,
+ texture(objectIdBuffer, uv + offset.xz).r,
+ texture(objectIdBuffer, uv - offset.xz).r);
+
+ float outline_opacity = 1.0 - dot(vec4(equal(uvec4(center_id), adjacent_ids)), vec4(0.25));
+
+ fragColor = world_data.object_outline_color * outline_opacity;
+}
diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c
index 0f7a4f8f9c8..65918fe8d71 100644
--- a/source/blender/draw/engines/workbench/workbench_data.c
+++ b/source/blender/draw/engines/workbench/workbench_data.c
@@ -247,7 +247,6 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
}
WORKBENCH_UBO_World *wd = &wpd->world_data;
- wd->matcap_orientation = (wpd->shading.flag & V3D_SHADING_MATCAP_FLIP_X) != 0;
studiolight_update_world(wpd, wpd->studio_light, wd);
@@ -255,11 +254,12 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
workbench_material_ubo_data(
wpd, NULL, NULL, &wpd->material_ubo_data_curr[0], V3D_SHADING_MATERIAL_COLOR);
+ copy_v2_v2(wd->viewport_size, DRW_viewport_size_get());
+ copy_v2_v2(wd->viewport_size_inv, DRW_viewport_invert_size_get());
copy_v3_v3(wd->object_outline_color, wpd->shading.object_outline_color);
wd->object_outline_color[3] = 1.0f;
-
- copy_v2_v2(wpd->world_data.viewport_size, DRW_viewport_size_get());
- copy_v2_v2(wpd->world_data.viewport_size_inv, DRW_viewport_invert_size_get());
+ wd->ui_scale = G_draw.block.sizePixel;
+ wd->matcap_orientation = (wpd->shading.flag & V3D_SHADING_MATCAP_FLIP_X) != 0;
workbench_shadow_world_data_update(wpd);
workbench_cavity_data_update(wpd);
diff --git a/source/blender/draw/engines/workbench/workbench_effect_cavity.c b/source/blender/draw/engines/workbench/workbench_effect_cavity.c
index 5f7f8feb42d..1b60e1e064b 100644
--- a/source/blender/draw/engines/workbench/workbench_effect_cavity.c
+++ b/source/blender/draw/engines/workbench/workbench_effect_cavity.c
@@ -124,7 +124,6 @@ void workbench_cavity_data_update(WORKBENCH_PrivateData *wpd)
wd->curvature_ridge = 0.5f / max_ff(SQUARE(shading->curvature_ridge_factor), 1e-4f);
wd->curvature_valley = 0.7f / max_ff(SQUARE(shading->curvature_valley_factor), 1e-4f);
- wd->curvature_offset = G_draw.block.sizePixel;
}
void workbench_cavity_cache_init(WORKBENCH_Data *data)
diff --git a/source/blender/draw/engines/workbench/workbench_effect_outline.c b/source/blender/draw/engines/workbench/workbench_effect_outline.c
new file mode 100644
index 00000000000..89260e9820d
--- /dev/null
+++ b/source/blender/draw/engines/workbench/workbench_effect_outline.c
@@ -0,0 +1,51 @@
+/*
+ * 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 WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Copyright 2020, Blender Foundation.
+ */
+
+/** \file
+ * \ingroup draw_engine
+ */
+
+#include "DRW_render.h"
+
+#include "workbench_engine.h"
+#include "workbench_private.h"
+
+void workbench_outline_cache_init(WORKBENCH_Data *data)
+{
+ WORKBENCH_PassList *psl = data->psl;
+ WORKBENCH_PrivateData *wpd = data->stl->wpd;
+ DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+ struct GPUShader *sh;
+ DRWShadingGroup *grp;
+
+ if (OBJECT_OUTLINE_ENABLED(wpd)) {
+ int state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA_PREMUL;
+ DRW_PASS_CREATE(psl->outline_pass, state);
+
+ sh = workbench_shader_outline_get();
+
+ grp = DRW_shgroup_create(sh, psl->outline_pass);
+ DRW_shgroup_uniform_texture(grp, "objectIdBuffer", wpd->object_id_tx);
+ DRW_shgroup_uniform_texture(grp, "depthBuffer", dtxl->depth);
+ DRW_shgroup_uniform_block(grp, "world_block", wpd->world_ubo);
+ DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
+ }
+ else {
+ psl->outline_pass = NULL;
+ }
+}
diff --git a/source/blender/draw/engines/workbench/workbench_engine.c b/source/blender/draw/engines/workbench/workbench_engine.c
index b9017f9bfff..73bff11bb78 100644
--- a/source/blender/draw/engines/workbench/workbench_engine.c
+++ b/source/blender/draw/engines/workbench/workbench_engine.c
@@ -68,6 +68,13 @@ static void workbench_engine_init(void *ved)
}
wpd->dummy_image_tx = txl->dummy_image_tx;
+ if (OBJECT_ID_PASS_ENABLED(wpd)) {
+ wpd->object_id_tx = DRW_texture_pool_query_fullscreen(GPU_R16UI, &draw_engine_workbench);
+ }
+ else {
+ DRW_TEXTURE_FREE_SAFE(wpd->object_id_tx);
+ }
+
workbench_opaque_engine_init(vedata);
workbench_transparent_engine_init(vedata);
// workbench_volume_engine_init();
@@ -84,6 +91,7 @@ static void workbench_cache_init(void *ved)
workbench_transparent_cache_init(vedata);
workbench_shadow_cache_init(vedata);
workbench_cavity_cache_init(vedata);
+ workbench_outline_cache_init(vedata);
// workbench_aa_create_pass(vedata);
// workbench_dof_create_pass(vedata);
@@ -363,6 +371,17 @@ static void workbench_cache_finish(void *ved)
});
}
+ if (wpd->object_id_tx) {
+ GPU_framebuffer_ensure_config(&fbl->id_clear_fb,
+ {
+ GPU_ATTACHMENT_NONE,
+ GPU_ATTACHMENT_TEXTURE(wpd->object_id_tx),
+ });
+ }
+ else {
+ GPU_FRAMEBUFFER_FREE_SAFE(fbl->id_clear_fb);
+ }
+
workbench_update_material_ubos(wpd);
/* TODO don't free reuse next redraw. */
@@ -387,6 +406,11 @@ static void workbench_draw_scene(void *ved)
float clear_col[4] = {0.0f, 0.0f, 0.0f, 0.0f};
float clear_col_with_alpha[4] = {0.0f, 0.0f, 0.0f, 1.0f};
+ if (fbl->id_clear_fb) {
+ GPU_framebuffer_bind(fbl->id_clear_fb);
+ GPU_framebuffer_clear_color(fbl->id_clear_fb, clear_col);
+ }
+
{
GPU_framebuffer_bind(dfbl->in_front_fb);
GPU_framebuffer_clear_depth(dfbl->in_front_fb, 1.0f);
@@ -442,8 +466,9 @@ static void workbench_draw_scene(void *ved)
}
}
- /* TODO(fclem) outline */
- // DRW_draw_pass(psl->outline_pass);
+ if (psl->outline_pass) {
+ DRW_draw_pass(psl->outline_pass);
+ }
/* TODO(fclem) dof */
diff --git a/source/blender/draw/engines/workbench/workbench_opaque.c b/source/blender/draw/engines/workbench/workbench_opaque.c
index b968f257007
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list