[Bf-blender-cvs] [869180548c9] blender-v3.1-release: Image editor: Fix drawing artifacts with render results.

Jeroen Bakker noreply at git.blender.org
Mon Jan 31 12:00:33 CET 2022


Commit: 869180548c9066009c7f22e98ae717e78a571129
Author: Jeroen Bakker
Date:   Mon Jan 31 11:59:16 2022 +0100
Branches: blender-v3.1-release
https://developer.blender.org/rB869180548c9066009c7f22e98ae717e78a571129

Image editor: Fix drawing artifacts with render results.

Use the input depth texture to determine if the color of the texture
should be shown.

===================================================================

M	source/blender/draw/engines/image/image_drawing_mode.hh
M	source/blender/draw/engines/image/shaders/image_engine_color_frag.glsl
M	source/blender/draw/engines/image/shaders/infos/engine_image_info.hh

===================================================================

diff --git a/source/blender/draw/engines/image/image_drawing_mode.hh b/source/blender/draw/engines/image/image_drawing_mode.hh
index 6113c661050..4cb0023ccb9 100644
--- a/source/blender/draw/engines/image/image_drawing_mode.hh
+++ b/source/blender/draw/engines/image/image_drawing_mode.hh
@@ -99,12 +99,14 @@ template<typename TextureMethod> class ScreenSpaceDrawingMode : public AbstractD
   {
     const ShaderParameters &sh_params = instance_data->sh_params;
     GPUShader *shader = IMAGE_shader_image_get();
+    DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
 
     DRWShadingGroup *shgrp = DRW_shgroup_create(shader, instance_data->passes.image_pass);
     DRW_shgroup_uniform_vec2_copy(shgrp, "farNearDistances", sh_params.far_near);
     DRW_shgroup_uniform_vec4_copy(shgrp, "shuffle", sh_params.shuffle);
     DRW_shgroup_uniform_int_copy(shgrp, "drawFlags", sh_params.flags);
     DRW_shgroup_uniform_bool_copy(shgrp, "imgPremultiplied", sh_params.use_premul_alpha);
+    DRW_shgroup_uniform_texture(shgrp, "depth_texture", dtxl->depth);
     float image_mat[4][4];
     unit_m4(image_mat);
     for (int i = 0; i < SCREEN_SPACE_DRAWING_MODE_TEXTURE_LEN; i++) {
@@ -151,9 +153,14 @@ template<typename TextureMethod> class ScreenSpaceDrawingMode : public AbstractD
         const int tile_y = image_tile.get_tile_y_offset();
         tile_user.tile = image_tile.get_tile_number();
 
-        if (!BKE_image_has_ibuf(image, &tile_user)) {
+        /* NOTE: `BKE_image_has_ibuf` doesn't work as it fails for render results. That could be a
+         * bug or a feature. For now we just acquire to determine if there is a texture. */
+        void *lock;
+        ImBuf *tile_buffer = BKE_image_acquire_ibuf(image, &tile_user, &lock);
+        if (tile_buffer == nullptr) {
           continue;
         }
+        BKE_image_release_ibuf(image, tile_buffer, lock);
 
         DRWShadingGroup *shsub = DRW_shgroup_create_sub(shgrp);
         float4 min_max_uv(tile_x, tile_y, tile_x + 1, tile_y + 1);
@@ -461,8 +468,10 @@ template<typename TextureMethod> class ScreenSpaceDrawingMode : public AbstractD
 
     DRW_view_set_active(instance_data->view);
     DRW_draw_pass(instance_data->passes.depth_pass);
+    GPU_framebuffer_bind(dfbl->color_only_fb);
     DRW_draw_pass(instance_data->passes.image_pass);
     DRW_view_set_active(nullptr);
+    GPU_framebuffer_bind(dfbl->default_fb);
   }
 };  // namespace clipping
 
diff --git a/source/blender/draw/engines/image/shaders/image_engine_color_frag.glsl b/source/blender/draw/engines/image/shaders/image_engine_color_frag.glsl
index fbb624e54ba..0edc18836f0 100644
--- a/source/blender/draw/engines/image/shaders/image_engine_color_frag.glsl
+++ b/source/blender/draw/engines/image/shaders/image_engine_color_frag.glsl
@@ -12,6 +12,11 @@
 void main()
 {
   ivec2 uvs_clamped = ivec2(uv_screen);
+  float depth = texelFetch(depth_texture, uvs_clamped, 0).r;
+  if (depth == 1.0) {
+    discard;
+  }
+
   vec4 tex_color = texelFetch(imageTexture, uvs_clamped, 0);
 
   if ((drawFlags & IMAGE_DRAW_FLAG_APPLY_ALPHA) != 0) {
diff --git a/source/blender/draw/engines/image/shaders/infos/engine_image_info.hh b/source/blender/draw/engines/image/shaders/infos/engine_image_info.hh
index 86a79d13e40..8b671686a5c 100644
--- a/source/blender/draw/engines/image/shaders/infos/engine_image_info.hh
+++ b/source/blender/draw/engines/image/shaders/infos/engine_image_info.hh
@@ -11,6 +11,7 @@ GPU_SHADER_CREATE_INFO(image_engine_color_shader)
     .push_constant(Type::INT, "drawFlags")
     .push_constant(Type::BOOL, "imgPremultiplied")
     .sampler(0, ImageType::FLOAT_2D, "imageTexture")
+    .sampler(1, ImageType::DEPTH_2D, "depth_texture")
     .vertex_source("image_engine_color_vert.glsl")
     .fragment_source("image_engine_color_frag.glsl")
     .additional_info("draw_modelmat")



More information about the Bf-blender-cvs mailing list