Commit: 62a7ac8f17ee8bf576f4d8db4a901598d2e64c74 Author: Clément Foucault Date: Sun Mar 1 14:26:56 2020 +0100 Branches: tmp-workbench-rewrite https://developer.blender.org/rB62a7ac8f17ee8bf576f4d8db4a901598d2e64c74
Workbench: Refactor: Add Infront support =================================================================== M source/blender/draw/CMakeLists.txt M source/blender/draw/engines/overlay/overlay_engine.c A source/blender/draw/engines/workbench/shaders/workbench_merge_infront_frag.glsl M source/blender/draw/engines/workbench/workbench_deferred.c M source/blender/draw/engines/workbench/workbench_engine.c M source/blender/draw/engines/workbench/workbench_materials.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 M source/blender/draw/engines/workbench/workbench_transparent.c =================================================================== diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt index 54db2655de2..3ce2681072f 100644 --- a/source/blender/draw/CMakeLists.txt +++ b/source/blender/draw/CMakeLists.txt @@ -265,6 +265,7 @@ data_to_c_simple(engines/workbench/shaders/workbench_ghost_resolve_frag.glsl SRC data_to_c_simple(engines/workbench/shaders/workbench_image_lib.glsl SRC) data_to_c_simple(engines/workbench/shaders/workbench_matcap_lib.glsl SRC) data_to_c_simple(engines/workbench/shaders/workbench_material_lib.glsl SRC) +data_to_c_simple(engines/workbench/shaders/workbench_merge_infront_frag.glsl SRC) data_to_c_simple(engines/workbench/shaders/workbench_object_outline_lib.glsl SRC) data_to_c_simple(engines/workbench/shaders/workbench_curvature_lib.glsl SRC) data_to_c_simple(engines/workbench/shaders/workbench_prepass_vert.glsl SRC) diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c index a8d2c4c6cf0..cc8bd0e51ba 100644 --- a/source/blender/draw/engines/overlay/overlay_engine.c +++ b/source/blender/draw/engines/overlay/overlay_engine.c @@ -373,9 +373,6 @@ static void OVERLAY_cache_finish(void *vedata) DRW_texture_ensure_fullscreen_2d(&dtxl->depth_in_front, GPU_DEPTH24_STENCIL8, 0); - GPU_framebuffer_ensure_config( - &dfbl->default_fb, - {GPU_ATTACHMENT_TEXTURE(dtxl->depth), GPU_ATTACHMENT_TEXTURE(dtxl->color)}); GPU_framebuffer_ensure_config( &dfbl->in_front_fb, {GPU_ATTACHMENT_TEXTURE(dtxl->depth_in_front), GPU_ATTACHMENT_TEXTURE(dtxl->color)}); diff --git a/source/blender/draw/engines/workbench/shaders/workbench_merge_infront_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_merge_infront_frag.glsl new file mode 100644 index 00000000000..58becb03290 --- /dev/null +++ b/source/blender/draw/engines/workbench/shaders/workbench_merge_infront_frag.glsl @@ -0,0 +1,18 @@ + +uniform sampler2D depthBuffer; + +in vec4 uvcoordsvar; + +out vec4 fragColor; + +void main() +{ + float depth = texture(depthBuffer, uvcoordsvar.st).r; + /* Discard background pixels. */ + if (depth == 1.0) { + discard; + } + /* Make this fragment occlude any fragment that will try to + * render over it in the normal passes. */ + gl_FragDepth = 0.0; +} \ No newline at end of file diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c index 762eeced176..f1528c2213c 100644 --- a/source/blender/draw/engines/workbench/workbench_deferred.c +++ b/source/blender/draw/engines/workbench/workbench_deferred.c @@ -508,7 +508,7 @@ void workbench_deferred_engine_init(WORKBENCH_Data *vedata) size[0], size[1], GPU_R16, &draw_engine_workbench_solid); } - GPU_framebuffer_ensure_config(&fbl->prepass_fb, + GPU_framebuffer_ensure_config(&fbl->opaque_fb, { GPU_ATTACHMENT_TEXTURE(dtxl->depth), GPU_ATTACHMENT_TEXTURE(e_data.color_buffer_tx), @@ -1286,8 +1286,8 @@ void workbench_deferred_draw_scene(WORKBENCH_Data *vedata) GPU_framebuffer_clear_color(fbl->id_clear_fb, clear_col); } - GPU_framebuffer_bind(fbl->prepass_fb); - GPU_framebuffer_clear(fbl->prepass_fb, clear_bits, clear_col, clear_depth, clear_stencil); + GPU_framebuffer_bind(fbl->opaque_fb); + GPU_framebuffer_clear(fbl->opaque_fb, clear_bits, clear_col, clear_depth, clear_stencil); DRW_draw_pass(psl->prepass_pass); DRW_draw_pass(psl->prepass_hair_pass); diff --git a/source/blender/draw/engines/workbench/workbench_engine.c b/source/blender/draw/engines/workbench/workbench_engine.c index 0879e5d98b4..25ede8e627b 100644 --- a/source/blender/draw/engines/workbench/workbench_engine.c +++ b/source/blender/draw/engines/workbench/workbench_engine.c @@ -268,6 +268,19 @@ static void workbench_cache_finish(void *ved) WORKBENCH_StorageList *stl = vedata->stl; WORKBENCH_PrivateData *wpd = stl->wpd; + /* TODO(fclem) Only do this when really needed. */ + { + /* HACK we allocate the infront depth here to avoid the overhead when if is not needed. */ + DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); + DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); + + DRW_texture_ensure_fullscreen_2d(&dtxl->depth_in_front, GPU_DEPTH24_STENCIL8, 0); + + GPU_framebuffer_ensure_config( + &dfbl->in_front_fb, + {GPU_ATTACHMENT_TEXTURE(dtxl->depth_in_front), GPU_ATTACHMENT_TEXTURE(dtxl->color)}); + } + workbench_update_material_ubos(wpd); if (wpd->material_hash) { @@ -285,24 +298,27 @@ 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}; + { + GPU_framebuffer_bind(dfbl->in_front_fb); + GPU_framebuffer_clear_depth(dfbl->in_front_fb, 1.0f); + } + GPU_framebuffer_bind(dfbl->color_only_fb); GPU_framebuffer_clear_color(dfbl->color_only_fb, clear_col); { - GPU_framebuffer_bind(fbl->prepass_fb); - DRW_draw_pass(psl->prepass_pass); + GPU_framebuffer_bind(fbl->opaque_fb); + DRW_draw_pass(psl->opaque_pass); /* TODO(fclem) shadows */ // DRW_draw_pass(psl->shadow_pass); { - /* TODO(fclem) infront */ - // GPU_framebuffer_bind(fbl->prepass_infront_fb); - // DRW_draw_pass(psl->prepass_infront_pass); + GPU_framebuffer_bind(fbl->opaque_infront_fb); + DRW_draw_pass(psl->opaque_infront_pass); - /* TODO(fclem) merge infront depth & stencil. */ - // GPU_framebuffer_bind(fbl->prepass_fb); - // DRW_draw_pass(psl->merge_infront_pass); + GPU_framebuffer_bind(fbl->opaque_fb); + DRW_draw_pass(psl->merge_infront_pass); } GPU_framebuffer_bind(dfbl->default_fb); @@ -322,14 +338,18 @@ static void workbench_draw_scene(void *ved) DRW_draw_pass(psl->transp_accum_pass); - { - /* TODO(fclem) infront */ - // GPU_framebuffer_bind(fbl->tranp_accum_infront_fb); - // DRW_draw_pass(psl->transp_accum_infront_pass); - } - GPU_framebuffer_bind(dfbl->color_only_fb); DRW_draw_pass(psl->transp_resolve_pass); + + { + GPU_framebuffer_bind(fbl->transp_accum_infront_fb); + GPU_framebuffer_clear_color(fbl->transp_accum_infront_fb, clear_col_with_alpha); + + DRW_draw_pass(psl->transp_accum_infront_pass); + + GPU_framebuffer_bind(dfbl->color_only_fb); + DRW_draw_pass(psl->transp_resolve_pass); + } } /* TODO(fclem) outline */ diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c index e93ee59f85f..f358e3028dd 100644 --- a/source/blender/draw/engines/workbench/workbench_materials.c +++ b/source/blender/draw/engines/workbench/workbench_materials.c @@ -474,6 +474,7 @@ DRWShadingGroup *workbench_material_setup(WORKBENCH_PrivateData *wpd, Image *ima = NULL; ImageUser *iuser = NULL; int interp; + const bool infront = (ob->dtx & OB_DRAWXRAY) != 0; if (color_type == V3D_SHADING_TEXTURE_COLOR) { workbench_material_get_image(ob, mat_nr, &ima, &iuser, &interp); @@ -507,7 +508,7 @@ DRWShadingGroup *workbench_material_setup(WORKBENCH_PrivateData *wpd, workbench_material_ubo_data(wpd, ob, ma, &wpd->material_ubo_data_curr[id], color_type); const bool transp = wpd->shading.xray_alpha < 1.0f || ma->a < 1.0f; - DRWShadingGroup *grp = wpd->prepass[transp].common_shgrp; + DRWShadingGroup *grp = wpd->prepass[transp][infront].common_shgrp; *grp_mat = grp = DRW_shgroup_create_sub(grp); DRW_shgroup_uniform_block(grp, "material_block", wpd->material_ubo_curr); DRW_shgroup_uniform_int_copy(grp, "materialIndex", id & 0xFFFu); @@ -515,7 +516,7 @@ DRWShadingGroup *workbench_material_setup(WORKBENCH_PrivateData *wpd, } case V3D_SHADING_VERTEX_COLOR: { const bool transp = wpd->shading.xray_alpha < 1.0f; - DRWShadingGroup *grp = wpd->prepass[transp].vcol_shgrp; + DRWShadingGroup *grp = wpd->prepass[transp][infront].vcol_shgrp; return grp; } default: { @@ -530,7 +531,7 @@ DRWShadingGroup *workbench_material_setup(WORKBENCH_PrivateData *wpd, workbench_material_ubo_data(wpd, ob, NULL, &wpd->material_ubo_data_curr[id], color_type); const bool transp = wpd->shading.xray_alpha < 1.0f || ob->color[3] < 1.0f; - DRWShadingGroup *grp = wpd->prepass[transp].common_shgrp; + DRWShadingGroup *grp = wpd->prepass[transp][infront].common_shgrp; if (resource_changed) { grp = DRW_shgroup_create_sub(grp); DRW_shgroup_uniform_block(grp, "material_block", wpd->material_ubo_curr); @@ -570,9 +571,10 @@ DRWShadingGroup *workbench_image_setup( return *grp_tex; } + const bool infront = (ob->dtx & OB_DRAWXRAY) != 0; const bool transp = wpd->shading.xray_alpha < 1.0f; - DRWShadingGroup *grp = (tex_tile_data) ? wpd->prepass[transp].image_tiled_shgrp : - wpd->prepass[transp].image_shgrp; + DRWShadingGroup *grp = (tex_tile_data) ? wpd->prepass[transp][infront].image_tiled_shgrp : + wpd->prepass[transp][infront].image_shgrp; *grp_tex = grp = DRW_shgroup_create_sub(grp); if (tex_tile_data) { diff --git a/source/blender/draw/engines/workbench/workbench_opaque.c b/source/blender/draw/engines/workbench/workbench_opaque.c index 0f1b91ce015..7ab11631f0b 100644 --- a/source/blender/draw/engines/workbench/workbench_opaque.c +++ b/source/blender/draw/engines/workbench/workbench_opaque.c @@ -45,13 +45,21 @@ void workbench_opaque_engine_init(WORKBENCH_Data *data) wpd->object_id_tx = DRW_texture_pool_query_fullscreen(id_tex_format, owner); } - GPU_framebuffer_ensure_config(&fbl->prepass_fb, + GPU_framebuffer_ensure_config(&fbl->opaque_fb, { GPU_ATTACHMENT_TEXTURE(dtxl->depth), GPU_ATTACHMENT_TEXTURE(wpd->material_buffer_tx), GPU_ATTACHMENT_TEXTURE(wpd->normal_bu @@ 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