[Bf-blender-cvs] [e9411b8ccf2] draw-colormanagement: Overlay: Cleanup Image background implementation

Clément Foucault noreply at git.blender.org
Fri Jan 24 19:24:20 CET 2020


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. @@



More information about the Bf-blender-cvs mailing list