From f492c8d488b7eb2166ca894e10a8128a1678a885 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Tue, 15 Sep 2020 12:28:58 +0200 Subject: Image Editor: Make Rendering of Pure Emissive Colors Optional There are some areas that don't handle pure emissive colors well. For example erasing alpha using 2d or 3d painting. Or blurring an image in the compositor. This patch makes the rendering of pure emissive colors optional. In the side panel of the Image editor it can still be enabled when needed. There currently isn't a better place to store it as it is related on how the image (or a layer of the image) is created. A future design needs to make sure that the full workflow is supported. --- source/blender/draw/engines/image/image_engine.c | 3 +++ source/blender/draw/engines/image/shaders/engine_image_frag.glsl | 7 +++++++ 2 files changed, 10 insertions(+) (limited to 'source/blender/draw') diff --git a/source/blender/draw/engines/image/image_engine.c b/source/blender/draw/engines/image/image_engine.c index 90bfb38dadf..99c812859c1 100644 --- a/source/blender/draw/engines/image/image_engine.c +++ b/source/blender/draw/engines/image/image_engine.c @@ -43,6 +43,7 @@ #define SIMA_DRAW_FLAG_SHUFFLING (1 << 2) #define SIMA_DRAW_FLAG_DEPTH (1 << 3) #define SIMA_DRAW_FLAG_DO_REPEAT (1 << 4) +#define SIMA_DRAW_FLAG_PURE_EMISSIVE (1 << 5) static void image_cache_image_add(DRWShadingGroup *grp, Image *image) { @@ -142,6 +143,7 @@ static void image_cache_image(IMAGE_Data *vedata, Image *image, ImageUser *iuser const bool is_tiled_texture = tex_tile_data != NULL; const bool do_repeat = (!is_tiled_texture) && ((sima->flag & SI_DRAW_TILE) != 0); const bool is_zoom_out = sima->zoom < 1.0f; + const bool show_pure_emissive_colors = (sima->flag & SI_SHOW_PURE_EMISSIVE) != 0; /* use interpolation filtering when zooming out */ eGPUSamplerState state = 0; @@ -149,6 +151,7 @@ static void image_cache_image(IMAGE_Data *vedata, Image *image, ImageUser *iuser int draw_flags = 0; SET_FLAG_FROM_TEST(draw_flags, do_repeat, SIMA_DRAW_FLAG_DO_REPEAT); + SET_FLAG_FROM_TEST(draw_flags, show_pure_emissive_colors, SIMA_DRAW_FLAG_PURE_EMISSIVE); if ((sima->flag & SI_USE_ALPHA) != 0) { /* Show RGBA */ diff --git a/source/blender/draw/engines/image/shaders/engine_image_frag.glsl b/source/blender/draw/engines/image/shaders/engine_image_frag.glsl index a79f4915c4d..d4eebb37ccb 100644 --- a/source/blender/draw/engines/image/shaders/engine_image_frag.glsl +++ b/source/blender/draw/engines/image/shaders/engine_image_frag.glsl @@ -6,6 +6,7 @@ #define SIMA_DRAW_FLAG_SHUFFLING (1 << 2) #define SIMA_DRAW_FLAG_DEPTH (1 << 3) #define SIMA_DRAW_FLAG_DO_REPEAT (1 << 4) +#define SIMA_DRAW_FLAG_PURE_EMISSIVE (1 << 5) #ifdef TILED_IMAGE uniform sampler2DArray imageTileArray; @@ -74,6 +75,12 @@ void main() tex_color = texture(imageTexture, uvs_clamped); #endif + if ((drawFlags & SIMA_DRAW_FLAG_PURE_EMISSIVE) == 0) { + if (imgPremultiplied && tex_color.a == 0.0) { + tex_color.rgb = vec3(0.0); + } + } + if ((drawFlags & SIMA_DRAW_FLAG_APPLY_ALPHA) != 0) { if (!imgPremultiplied && tex_color.a != 0.0 && tex_color.a != 1.0) { tex_color.rgb *= tex_color.a; -- cgit v1.2.3