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>2021-01-26 16:05:50 +0300
committerJeroen Bakker <jeroen@blender.org>2021-01-26 16:25:18 +0300
commited809866b17262b1eaa24765aaf711e44f62d862 (patch)
treeb50344480b1bdebbf74c0b263477e2a5858864c1 /source/blender/gpu
parente6aece32a0499fb50648ad6249c38af9fffc8d24 (diff)
Viewport Rendering: Don't clamp when overlays are disabled.
During viewport rendering the color values were clamped in order to apply the overlay on top of it. This clamping would show the scene colors washed out. This patch adds a work around to skip the clamping when the overlays are turned off. Parial fix for {T77909}
Diffstat (limited to 'source/blender/gpu')
-rw-r--r--source/blender/gpu/GPU_viewport.h6
-rw-r--r--source/blender/gpu/intern/gpu_viewport.c20
-rw-r--r--source/blender/gpu/shaders/gpu_shader_image_overlays_merge_frag.glsl10
3 files changed, 23 insertions, 13 deletions
diff --git a/source/blender/gpu/GPU_viewport.h b/source/blender/gpu/GPU_viewport.h
index d8e4c5377b0..095e17f344e 100644
--- a/source/blender/gpu/GPU_viewport.h
+++ b/source/blender/gpu/GPU_viewport.h
@@ -114,7 +114,8 @@ void GPU_viewport_draw_to_screen(GPUViewport *viewport, int view, const rcti *re
void GPU_viewport_draw_to_screen_ex(GPUViewport *viewport,
int view,
const rcti *rect,
- bool display_colorspace);
+ bool display_colorspace,
+ bool do_overlay_merge);
void GPU_viewport_free(GPUViewport *viewport);
void GPU_viewport_colorspace_set(GPUViewport *viewport,
@@ -125,7 +126,8 @@ void GPU_viewport_colorspace_set(GPUViewport *viewport,
void GPU_viewport_bind_from_offscreen(GPUViewport *viewport, struct GPUOffScreen *ofs);
void GPU_viewport_unbind_from_offscreen(GPUViewport *viewport,
struct GPUOffScreen *ofs,
- bool display_colorspace);
+ bool display_colorspace,
+ bool do_overlay_merge);
ViewportMemoryPool *GPU_viewport_mempool_get(GPUViewport *viewport);
struct DRWInstanceDataList *GPU_viewport_instance_data_list_get(GPUViewport *viewport);
diff --git a/source/blender/gpu/intern/gpu_viewport.c b/source/blender/gpu/intern/gpu_viewport.c
index a83654d31e7..205ba1d06d6 100644
--- a/source/blender/gpu/intern/gpu_viewport.c
+++ b/source/blender/gpu/intern/gpu_viewport.c
@@ -749,7 +749,8 @@ static void gpu_viewport_batch_free(GPUViewport *viewport)
static void gpu_viewport_draw_colormanaged(GPUViewport *viewport,
const rctf *rect_pos,
const rctf *rect_uv,
- bool display_colorspace)
+ bool display_colorspace,
+ bool do_overlay_merge)
{
DefaultTextureList *dtxl = viewport->txl;
GPUTexture *color = dtxl->color;
@@ -771,7 +772,7 @@ static void gpu_viewport_draw_colormanaged(GPUViewport *viewport,
NULL,
viewport->dither,
false,
- true);
+ do_overlay_merge);
}
GPUBatch *batch = gpu_viewport_batch_get(viewport, rect_pos, rect_uv);
@@ -780,6 +781,7 @@ static void gpu_viewport_draw_colormanaged(GPUViewport *viewport,
}
else {
GPU_batch_program_set_builtin(batch, GPU_SHADER_2D_IMAGE_OVERLAYS_MERGE);
+ GPU_batch_uniform_1i(batch, "overlay", do_overlay_merge);
GPU_batch_uniform_1i(batch, "display_transform", display_colorspace);
GPU_batch_uniform_1i(batch, "image_texture", 0);
GPU_batch_uniform_1i(batch, "overlays_texture", 1);
@@ -803,7 +805,8 @@ static void gpu_viewport_draw_colormanaged(GPUViewport *viewport,
void GPU_viewport_draw_to_screen_ex(GPUViewport *viewport,
int view,
const rcti *rect,
- bool display_colorspace)
+ bool display_colorspace,
+ bool do_overlay_merge)
{
gpu_viewport_framebuffer_view_set(viewport, view);
DefaultFramebufferList *dfbl = viewport->fbl;
@@ -850,7 +853,8 @@ void GPU_viewport_draw_to_screen_ex(GPUViewport *viewport,
SWAP(float, uv_rect.ymin, uv_rect.ymax);
}
- gpu_viewport_draw_colormanaged(viewport, &pos_rect, &uv_rect, display_colorspace);
+ gpu_viewport_draw_colormanaged(
+ viewport, &pos_rect, &uv_rect, display_colorspace, do_overlay_merge);
}
/**
@@ -862,7 +866,7 @@ void GPU_viewport_draw_to_screen_ex(GPUViewport *viewport,
*/
void GPU_viewport_draw_to_screen(GPUViewport *viewport, int view, const rcti *rect)
{
- GPU_viewport_draw_to_screen_ex(viewport, view, rect, true);
+ GPU_viewport_draw_to_screen_ex(viewport, view, rect, true, true);
}
/**
@@ -870,7 +874,8 @@ void GPU_viewport_draw_to_screen(GPUViewport *viewport, int view, const rcti *re
*/
void GPU_viewport_unbind_from_offscreen(GPUViewport *viewport,
struct GPUOffScreen *ofs,
- bool display_colorspace)
+ bool display_colorspace,
+ bool do_overlay_merge)
{
DefaultFramebufferList *dfbl = viewport->fbl;
DefaultTextureList *dtxl = viewport->txl;
@@ -896,7 +901,8 @@ void GPU_viewport_unbind_from_offscreen(GPUViewport *viewport,
.ymax = 1.0f,
};
- gpu_viewport_draw_colormanaged(viewport, &pos_rect, &uv_rect, display_colorspace);
+ gpu_viewport_draw_colormanaged(
+ viewport, &pos_rect, &uv_rect, display_colorspace, do_overlay_merge);
/* This one is from the offscreen. Don't free it with the viewport. */
dtxl->depth = NULL;
diff --git a/source/blender/gpu/shaders/gpu_shader_image_overlays_merge_frag.glsl b/source/blender/gpu/shaders/gpu_shader_image_overlays_merge_frag.glsl
index 73f40c693ae..7f3fe2f5252 100644
--- a/source/blender/gpu/shaders/gpu_shader_image_overlays_merge_frag.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_image_overlays_merge_frag.glsl
@@ -4,6 +4,7 @@
uniform sampler2D image_texture;
uniform sampler2D overlays_texture;
uniform bool display_transform;
+uniform bool overlay;
in vec2 texCoord_interp;
@@ -30,12 +31,13 @@ void linearrgb_to_srgb(vec4 col_from, out vec4 col_to)
void main()
{
fragColor = texture(image_texture, texCoord_interp.st);
-
vec4 overlay_col = texture(overlays_texture, texCoord_interp.st);
- fragColor = clamp(fragColor, 0.0, 1.0);
- fragColor *= 1.0 - overlay_col.a;
- fragColor += overlay_col;
+ if (overlay) {
+ fragColor = clamp(fragColor, 0.0, 1.0);
+ fragColor *= 1.0 - overlay_col.a;
+ fragColor += overlay_col;
+ }
if (display_transform) {
linearrgb_to_srgb(fragColor, fragColor);