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}
This commit is contained in:
@@ -1715,8 +1715,8 @@ void DRW_draw_render_loop_offscreen(struct Depsgraph *depsgraph,
|
||||
|
||||
GPU_matrix_identity_set();
|
||||
GPU_matrix_identity_projection_set();
|
||||
|
||||
GPU_viewport_unbind_from_offscreen(render_viewport, ofs, do_color_management);
|
||||
const bool do_overlays = (v3d->flag2 & V3D_HIDE_OVERLAYS) == 0;
|
||||
GPU_viewport_unbind_from_offscreen(render_viewport, ofs, do_color_management, do_overlays);
|
||||
|
||||
if (draw_background) {
|
||||
/* Reset default. */
|
||||
|
@@ -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);
|
||||
|
@@ -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;
|
||||
|
@@ -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);
|
||||
|
@@ -92,7 +92,8 @@ static void wm_xr_draw_viewport_buffers_to_active_framebuffer(
|
||||
if (is_upside_down) {
|
||||
SWAP(int, rect.ymin, rect.ymax);
|
||||
}
|
||||
GPU_viewport_draw_to_screen_ex(surface_data->viewport, 0, &rect, draw_view->expects_srgb_buffer);
|
||||
GPU_viewport_draw_to_screen_ex(
|
||||
surface_data->viewport, 0, &rect, draw_view->expects_srgb_buffer, true);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user