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. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs