Commit: e9411b8ccf27d208c1d68571ee5abb415927b5b1 Author: Clément Foucault Date: Fri Jan 24 18:08:20 2020 +0100 Branches: draw-colormanagement https://developer.blender.org/rBe9411b8ccf27d208c1d68571ee5abb415927b5b1
Overlay: Cleanup Image background implementation The background images are now rendered normally on a cleared canvas. They then get masked by the render when the background is drawn with a special blend mode. =================================================================== M source/blender/draw/engines/overlay/overlay_background.c M source/blender/draw/engines/overlay/overlay_engine.c M source/blender/draw/engines/overlay/overlay_image.c M source/blender/draw/engines/overlay/overlay_private.h M source/blender/draw/engines/overlay/shaders/background_frag.glsl M source/blender/draw/engines/overlay/shaders/image_frag.glsl M source/blender/draw/intern/DRW_render.h M source/blender/draw/intern/draw_manager_exec.c M source/blender/draw/intern/draw_view.c =================================================================== diff --git a/source/blender/draw/engines/overlay/overlay_background.c b/source/blender/draw/engines/overlay/overlay_background.c index 5128f43e78e..e4f891dc797 100644 --- a/source/blender/draw/engines/overlay/overlay_background.c +++ b/source/blender/draw/engines/overlay/overlay_background.c @@ -29,13 +29,14 @@ void OVERLAY_background_cache_init(OVERLAY_Data *vedata) OVERLAY_PassList *psl = vedata->psl; DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); - DRWState state = DRW_STATE_WRITE_COLOR; + DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_BACKGROUND; DRW_PASS_CREATE(psl->background_ps, state); GPUShader *sh = OVERLAY_shader_background(); DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->background_ps); DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo); - DRW_shgroup_uniform_texture_ref(grp, "colorBuf", &dtxl->color); + DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", &dtxl->color); + DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth); DRW_shgroup_call_procedural_triangles(grp, NULL, 1); } diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c index 4df51db6083..d0757ced053 100644 --- a/source/blender/draw/engines/overlay/overlay_engine.c +++ b/source/blender/draw/engines/overlay/overlay_engine.c @@ -395,7 +395,13 @@ static void OVERLAY_draw_scene(void *vedata) DRW_view_set_active(NULL); + if (DRW_state_is_fbo()) { + GPU_framebuffer_bind(fbl->overlay_color_only_fb); + } + + OVERLAY_image_background_draw(vedata); OVERLAY_background_draw(vedata); + OVERLAY_outline_draw(vedata); if (DRW_state_is_fbo()) { diff --git a/source/blender/draw/engines/overlay/overlay_image.c b/source/blender/draw/engines/overlay/overlay_image.c index cda55fcfb5e..e82335b80ff 100644 --- a/source/blender/draw/engines/overlay/overlay_image.c +++ b/source/blender/draw/engines/overlay/overlay_image.c @@ -53,11 +53,8 @@ void OVERLAY_image_cache_init(OVERLAY_Data *vedata) OVERLAY_PrivateData *pd = vedata->stl->pd; DRWState state; - state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_GREATER | DRW_STATE_BLEND_ALPHA_UNDER_PREMUL; - DRW_PASS_CREATE(psl->image_background_under_ps, state); - - state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_BLEND_ALPHA; - DRW_PASS_CREATE(psl->image_background_over_ps, state); + state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_GREATER | DRW_STATE_BLEND_ALPHA_PREMUL; + DRW_PASS_CREATE(psl->image_background_ps, state); state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS; DRW_PASS_CREATE(psl->image_empties_ps, state | pd->clipping_state); @@ -326,29 +323,18 @@ void OVERLAY_image_camera_cache_populate(OVERLAY_Data *vedata, Object *ob) mul_m4_m4m4(mat, norm_obmat, mat); const bool is_foreground = (bgpic->flag & CAM_BGIMG_FLAG_FOREGROUND) != 0; - float color_alpha[4] = {1.0f, 1.0f, 1.0f, bgpic->alpha}; float color_premult_alpha[4] = {bgpic->alpha, bgpic->alpha, bgpic->alpha, bgpic->alpha}; - /* When drawing background we do 2 passes. - * - One alpha over, which works where background is visible. - * - One alpha under, works under partially visible objects. (only in cycles) - * This approach is not ideal and should be revisited. - **/ - for (int i = 0; i < (is_foreground ? 1 : 2); i++) { - DRWPass *pass = is_foreground ? psl->image_foreground_ps : - ((i == 0) ? psl->image_background_under_ps : - psl->image_background_over_ps); - GPUShader *sh = OVERLAY_shader_image(); - DRWShadingGroup *grp = DRW_shgroup_create(sh, pass); - float *color = (is_foreground || i == 1) ? color_alpha : color_premult_alpha; - DRW_shgroup_uniform_texture(grp, "imgTexture", tex); - DRW_shgroup_uniform_bool_copy(grp, "imgPremultiplied", use_alpha_premult); - DRW_shgroup_uniform_bool_copy(grp, "imgAlphaBlend", true); - DRW_shgroup_uniform_bool_copy(grp, "imgLinear", !DRW_state_do_color_management()); - DRW_shgroup_uniform_bool_copy(grp, "depthSet", true); - DRW_shgroup_uniform_vec4_copy(grp, "color", color); - DRW_shgroup_call_obmat(grp, DRW_cache_quad_get(), mat); - } + DRWPass *pass = is_foreground ? psl->image_foreground_ps : psl->image_background_ps; + + GPUShader *sh = OVERLAY_shader_image(); + DRWShadingGroup *grp = DRW_shgroup_create(sh, pass); + DRW_shgroup_uniform_texture(grp, "imgTexture", tex); + DRW_shgroup_uniform_bool_copy(grp, "imgPremultiplied", use_alpha_premult); + DRW_shgroup_uniform_bool_copy(grp, "imgAlphaBlend", true); + DRW_shgroup_uniform_bool_copy(grp, "depthSet", true); + DRW_shgroup_uniform_vec4_copy(grp, "color", color_premult_alpha); + DRW_shgroup_call_obmat(grp, DRW_cache_quad_get(), mat); } } } @@ -423,7 +409,6 @@ void OVERLAY_image_empty_cache_populate(OVERLAY_Data *vedata, Object *ob) DRW_shgroup_uniform_texture(grp, "imgTexture", tex); DRW_shgroup_uniform_bool_copy(grp, "imgPremultiplied", use_alpha_premult); DRW_shgroup_uniform_bool_copy(grp, "imgAlphaBlend", use_alpha_blend); - DRW_shgroup_uniform_bool_copy(grp, "imgLinear", false); DRW_shgroup_uniform_bool_copy(grp, "depthSet", depth_mode != OB_EMPTY_IMAGE_DEPTH_DEFAULT); DRW_shgroup_uniform_vec4_copy(grp, "color", ob->color); DRW_shgroup_call_obmat(grp, DRW_cache_quad_get(), mat); @@ -434,30 +419,25 @@ void OVERLAY_image_cache_finish(OVERLAY_Data *vedata) { OVERLAY_PassList *psl = vedata->psl; - DRW_pass_sort_shgroup_reverse(psl->image_background_under_ps); DRW_pass_sort_shgroup_z(psl->image_empties_blend_ps); DRW_pass_sort_shgroup_z(psl->image_empties_front_ps); DRW_pass_sort_shgroup_z(psl->image_empties_back_ps); } +void OVERLAY_image_background_draw(OVERLAY_Data *vedata) +{ + OVERLAY_PassList *psl = vedata->psl; + + DRW_draw_pass(psl->image_background_ps); + DRW_draw_pass(psl->image_empties_back_ps); +} + void OVERLAY_image_draw(OVERLAY_Data *vedata) { OVERLAY_PassList *psl = vedata->psl; OVERLAY_PrivateData *pd = vedata->stl->pd; - OVERLAY_FramebufferList *fbl = vedata->fbl; - - const DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); DRW_view_set_active(pd->view_reference_images); - DRW_draw_pass(psl->image_background_over_ps); - - if (DRW_state_is_fbo() && !DRW_pass_is_empty(psl->image_background_under_ps)) { - GPU_framebuffer_bind(dfbl->default_fb); - DRW_draw_pass(psl->image_background_under_ps); - GPU_framebuffer_bind(fbl->overlay_default_fb); - } - - DRW_draw_pass(psl->image_empties_back_ps); DRW_draw_pass(psl->image_empties_ps); DRW_draw_pass(psl->image_empties_blend_ps); diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h index 2c3d697c03a..7a1ec41c485 100644 --- a/source/blender/draw/engines/overlay/overlay_private.h +++ b/source/blender/draw/engines/overlay/overlay_private.h @@ -76,8 +76,7 @@ typedef struct OVERLAY_PassList { DRWPass *extra_grid_ps; DRWPass *facing_ps; DRWPass *grid_ps; - DRWPass *image_background_under_ps; - DRWPass *image_background_over_ps; + DRWPass *image_background_ps; DRWPass *image_empties_ps; DRWPass *image_empties_back_ps; DRWPass *image_empties_blend_ps; @@ -478,6 +477,7 @@ void OVERLAY_image_camera_cache_populate(OVERLAY_Data *vedata, Object *ob); void OVERLAY_image_empty_cache_populate(OVERLAY_Data *vedata, Object *ob); void OVERLAY_image_cache_finish(OVERLAY_Data *vedata); void OVERLAY_image_draw(OVERLAY_Data *vedata); +void OVERLAY_image_background_draw(OVERLAY_Data *vedata); void OVERLAY_image_in_front_draw(OVERLAY_Data *vedata); void OVERLAY_metaball_cache_init(OVERLAY_Data *vedata); diff --git a/source/blender/draw/engines/overlay/shaders/background_frag.glsl b/source/blender/draw/engines/overlay/shaders/background_frag.glsl index ba1d347783b..7575509adcf 100644 --- a/source/blender/draw/engines/overlay/shaders/background_frag.glsl +++ b/source/blender/draw/engines/overlay/shaders/background_frag.glsl @@ -1,5 +1,6 @@ -uniform sampler2D colorBuf; +uniform sampler2D colorBuffer; +uniform sampler2D depthBuffer; in vec4 uvcoordsvar; @@ -7,9 +8,22 @@ out vec4 fragColor; void main() { - float alpha = texture(colorBuf, uvcoordsvar.st).a; + /* The blend equation is: + * resutl.rgb = SRC.rgb * (1 - DST.a) + DST.rgb * (SRC.a) + * result.a = SRC.a * 0 + DST.a * SRC.a + * This removes the alpha channel and put the background behind reference images + * while masking the reference images by the render alpha. + */ + float alpha = texture(colorBuffer, uvcoordsvar.st).a; + float depth = texture(depthBuffer, uvcoordsvar.st).r; + /* Mimic alpha under behavior. Result is premultiplied. */ - fragColor = vec4(colorBackground.rgb, 0.0) * (1.0 - alpha); + fragColor = vec4(colorBackground.rgb, 1.0) * (1.0 - alpha); + + /* Special case: If the render is not transparent, do not clear alpha values. */ + if (depth == 1.0 && alpha == 1.0) { + fragColor.a = 1.0; + } /* TODO Gradient Background. */ /* TODO Alpha checker Background. */ diff --git a/source/blender/draw/engines/overlay/shaders/image_frag.glsl b/source/blender/draw/engines/overlay/shaders/image_frag.glsl index 0da7067851d..298ba1e27ed 100644 --- a/source/blender/draw/engines/overlay/shaders/image_frag.glsl +++ b/source/blender/draw/engines/overlay/shaders/image_frag.glsl @@ -2,7 +2,6 @@ uniform sampler2D imgTexture; uniform bool imgPremultiplied; uniform bool imgAlphaBlend; -uniform bool imgLinear; uniform vec4 color; in vec2 uvs; @@ -13,12 +12,8 @@ void main() { vec2 uvs_clamped = clamp(uvs, 0.0, 1.0); vec4 tex_color; - if (imgLinear) { - tex_color = texture_read_as_linearrgb(imgTexture, imgPremultiplied, uvs_clamped); - } - else { - tex_color = texture_read_as_srgb(imgTexture, imgPremultiplied, uvs_clamped); - } + tex_color = texture_read_as_linearrgb(imgTexture, imgPremultiplied, uvs_clamped); + fragColor = tex_color @@ 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