Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen Bakker <jeroen@blender.org>2019-12-05 11:36:58 +0300
committerJeroen Bakker <jeroen@blender.org>2019-12-05 14:15:27 +0300
commit31c77326c9dbfc029df969ec4d85a0faccb91b10 (patch)
tree983e2d28b268955624ff42cd8d855679d4196f1c /source/blender/draw/engines/overlay/overlay_image.c
parente2806b7429c7d001687ae42e5173827989bb8e42 (diff)
Fix T72154: Background Camera Images
The Camera Background Images uses a alpha under blending. For alpha under blending to work correctly the framebuffer containing the result of the render engine needs to be active (`DefaultFramebufferList.default_fb`) and the source blend color needs to be premultiplied with alpha. Due to recent refactoring this wasn't the case and it seemed that the background image was drawn in front of the scene. This patch sets the correct state so it seems to be drawn behind the scene. Reviewed By: fclem Differential Revision: https://developer.blender.org/D6365
Diffstat (limited to 'source/blender/draw/engines/overlay/overlay_image.c')
-rw-r--r--source/blender/draw/engines/overlay/overlay_image.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/source/blender/draw/engines/overlay/overlay_image.c b/source/blender/draw/engines/overlay/overlay_image.c
index 34e382b2e4a..cda55fcfb5e 100644
--- a/source/blender/draw/engines/overlay/overlay_image.c
+++ b/source/blender/draw/engines/overlay/overlay_image.c
@@ -326,6 +326,9 @@ 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)
@@ -337,7 +340,7 @@ void OVERLAY_image_camera_cache_populate(OVERLAY_Data *vedata, Object *ob)
psl->image_background_over_ps);
GPUShader *sh = OVERLAY_shader_image();
DRWShadingGroup *grp = DRW_shgroup_create(sh, pass);
- float color[4] = {1.0f, 1.0f, 1.0f, bgpic->alpha};
+ 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);
@@ -441,11 +444,19 @@ void OVERLAY_image_draw(OVERLAY_Data *vedata)
{
OVERLAY_PassList *psl = vedata->psl;
OVERLAY_PrivateData *pd = vedata->stl->pd;
+ OVERLAY_FramebufferList *fbl = vedata->fbl;
- DRW_view_set_active(pd->view_reference_images);
+ const DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
+ DRW_view_set_active(pd->view_reference_images);
DRW_draw_pass(psl->image_background_over_ps);
- DRW_draw_pass(psl->image_background_under_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);