From 869180548c9066009c7f22e98ae717e78a571129 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Mon, 31 Jan 2022 11:59:16 +0100 Subject: Image editor: Fix drawing artifacts with render results. Use the input depth texture to determine if the color of the texture should be shown. --- source/blender/draw/engines/image/image_drawing_mode.hh | 11 ++++++++++- .../draw/engines/image/shaders/image_engine_color_frag.glsl | 5 +++++ .../draw/engines/image/shaders/infos/engine_image_info.hh | 1 + 3 files changed, 16 insertions(+), 1 deletion(-) 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 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 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 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") -- cgit v1.2.3