From 5f89e400ffb07a706acb0b1e1d6b709f09bec5cf Mon Sep 17 00:00:00 2001 From: Frank Richter Date: Fri, 19 Mar 2021 19:31:26 +0100 Subject: [PATCH 1/3] Reintroduced 'full screen blend' --- src/refresh/vkpt/main.c | 2 ++ src/refresh/vkpt/shader/global_ubo.h | 2 ++ src/refresh/vkpt/shader/tone_mapping_apply.comp | 6 ++++++ 3 files changed, 10 insertions(+) diff --git a/src/refresh/vkpt/main.c b/src/refresh/vkpt/main.c index 61d83a1da..d18d4675d 100644 --- a/src/refresh/vkpt/main.c +++ b/src/refresh/vkpt/main.c @@ -2683,6 +2683,8 @@ R_RenderFrame_RTX(refdef_t *fd) prepare_ubo(fd, viewleaf, &ref_mode, sky_matrix, render_world); ubo->prev_adapted_luminance = prev_adapted_luminance; + Vector4Copy(fd->blend, ubo->fs_blend_color); + vkpt_physical_sky_update_ubo(ubo, &sun_light, render_world); vkpt_bloom_update(ubo, frame_time, ubo->medium != MEDIUM_NONE, menu_mode); diff --git a/src/refresh/vkpt/shader/global_ubo.h b/src/refresh/vkpt/shader/global_ubo.h index 0eaf53cb4..11a6e5303 100644 --- a/src/refresh/vkpt/shader/global_ubo.h +++ b/src/refresh/vkpt/shader/global_ubo.h @@ -104,6 +104,7 @@ with this program; if not, write to the Free Software Foundation, Inc., UBO_CVAR_DO(tm_exposure_bias, -1.0) /* exposure bias, log-2 scale */ \ UBO_CVAR_DO(tm_exposure_speed_down, 1) /* speed of exponential eye adaptation when scene gets darker, 0 means instant */ \ UBO_CVAR_DO(tm_exposure_speed_up, 2) /* speed of exponential eye adaptation when scene gets brighter, 0 means instant */ \ + UBO_CVAR_DO(tm_blend_scale, 1) /* scale factor for full screen blend intensity [0..1] */ \ UBO_CVAR_DO(tm_high_percentile, 90) /* high percentile for computing histogram average, (0..100] */ \ UBO_CVAR_DO(tm_knee_start, 0.6) /* where to switch from a linear to a rational function ramp in the post-tonemapping process, (0..1) */ \ UBO_CVAR_DO(tm_low_percentile, 70) /* low percentile for computing histogram average, [0..100) */ \ @@ -189,6 +190,7 @@ with this program; if not, write to the Free Software Foundation, Inc., GLOBAL_UBO_VAR_LIST_DO(vec2, sub_pixel_jitter) \ GLOBAL_UBO_VAR_LIST_DO(float, prev_adapted_luminance) \ GLOBAL_UBO_VAR_LIST_DO(float, padding1) \ + GLOBAL_UBO_VAR_LIST_DO(vec4, fs_blend_color) \ \ GLOBAL_UBO_VAR_LIST_DO(vec4, world_center) \ GLOBAL_UBO_VAR_LIST_DO(vec4, world_size) \ diff --git a/src/refresh/vkpt/shader/tone_mapping_apply.comp b/src/refresh/vkpt/shader/tone_mapping_apply.comp index 4d7d1a2d5..9eb24e651 100644 --- a/src/refresh/vkpt/shader/tone_mapping_apply.comp +++ b/src/refresh/vkpt/shader/tone_mapping_apply.comp @@ -130,6 +130,12 @@ void main() // Get input color and luminance. vec3 input_color = imageLoad(IMG_TAA_OUTPUT, ipos).rgb; input_color /= STORAGE_SCALE_HDR; + + // Mix in full screen blend color + vec4 blend_color = global_ubo.fs_blend_color; + blend_color.rgb *= global_ubo.prev_adapted_luminance; + input_color = mix(input_color, blend_color.rgb, blend_color.a * clamp(global_ubo.tm_blend_scale, 0, 1)); + const float lum = max(luminance(input_color), exp2(min_log_luminance)); // Apply linear interpolation manually From eccdc44d0607b16fba8ac8148a1a2d3c0ef5a213 Mon Sep 17 00:00:00 2001 From: Frank Richter Date: Fri, 19 Mar 2021 19:59:48 +0100 Subject: [PATCH 2/3] Fade full screen blend strength between screen border and center --- src/refresh/vkpt/shader/global_ubo.h | 4 +++- src/refresh/vkpt/shader/tone_mapping_apply.comp | 8 +++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/refresh/vkpt/shader/global_ubo.h b/src/refresh/vkpt/shader/global_ubo.h index 11a6e5303..df4bb66a5 100644 --- a/src/refresh/vkpt/shader/global_ubo.h +++ b/src/refresh/vkpt/shader/global_ubo.h @@ -104,7 +104,9 @@ with this program; if not, write to the Free Software Foundation, Inc., UBO_CVAR_DO(tm_exposure_bias, -1.0) /* exposure bias, log-2 scale */ \ UBO_CVAR_DO(tm_exposure_speed_down, 1) /* speed of exponential eye adaptation when scene gets darker, 0 means instant */ \ UBO_CVAR_DO(tm_exposure_speed_up, 2) /* speed of exponential eye adaptation when scene gets brighter, 0 means instant */ \ - UBO_CVAR_DO(tm_blend_scale, 1) /* scale factor for full screen blend intensity [0..1] */ \ + UBO_CVAR_DO(tm_blend_scale_border, 1) /* scale factor for full screen blend intensity, at screen border */ \ + UBO_CVAR_DO(tm_blend_scale_center, 0.3) /* scale factor for full screen blend intensity, at screen center */ \ + UBO_CVAR_DO(tm_blend_scale_fade_exp, 4) /* exponent used to interpolate between "border" and "center" factors */ \ UBO_CVAR_DO(tm_high_percentile, 90) /* high percentile for computing histogram average, (0..100] */ \ UBO_CVAR_DO(tm_knee_start, 0.6) /* where to switch from a linear to a rational function ramp in the post-tonemapping process, (0..1) */ \ UBO_CVAR_DO(tm_low_percentile, 70) /* low percentile for computing histogram average, [0..100) */ \ diff --git a/src/refresh/vkpt/shader/tone_mapping_apply.comp b/src/refresh/vkpt/shader/tone_mapping_apply.comp index 9eb24e651..a35c39e45 100644 --- a/src/refresh/vkpt/shader/tone_mapping_apply.comp +++ b/src/refresh/vkpt/shader/tone_mapping_apply.comp @@ -134,7 +134,13 @@ void main() // Mix in full screen blend color vec4 blend_color = global_ubo.fs_blend_color; blend_color.rgb *= global_ubo.prev_adapted_luminance; - input_color = mix(input_color, blend_color.rgb, blend_color.a * clamp(global_ubo.tm_blend_scale, 0, 1)); + + // Fade strength of blend effect between center and border + vec2 norm_pos = (vec2(ipos) / vec2(screenSize) - vec2(0.5)) * vec2(2); + float blend_color_scale = mix(global_ubo.tm_blend_scale_center, global_ubo.tm_blend_scale_border, + pow(min(length(norm_pos), 1), global_ubo.tm_blend_scale_fade_exp)); + + input_color = mix(input_color, blend_color.rgb, blend_color.a * clamp(blend_color_scale, 0, 1)); const float lum = max(luminance(input_color), exp2(min_log_luminance)); From 1455826b3c24b517ba5bf84b47b149294d40254e Mon Sep 17 00:00:00 2001 From: Frank Richter Date: Sat, 20 Mar 2021 12:35:26 +0100 Subject: [PATCH 3/3] Tweak full screen blending to be more visible against bright pixels --- src/refresh/vkpt/shader/global_ubo.h | 2 +- src/refresh/vkpt/shader/tone_mapping_apply.comp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/refresh/vkpt/shader/global_ubo.h b/src/refresh/vkpt/shader/global_ubo.h index df4bb66a5..9c64f1c76 100644 --- a/src/refresh/vkpt/shader/global_ubo.h +++ b/src/refresh/vkpt/shader/global_ubo.h @@ -105,7 +105,7 @@ with this program; if not, write to the Free Software Foundation, Inc., UBO_CVAR_DO(tm_exposure_speed_down, 1) /* speed of exponential eye adaptation when scene gets darker, 0 means instant */ \ UBO_CVAR_DO(tm_exposure_speed_up, 2) /* speed of exponential eye adaptation when scene gets brighter, 0 means instant */ \ UBO_CVAR_DO(tm_blend_scale_border, 1) /* scale factor for full screen blend intensity, at screen border */ \ - UBO_CVAR_DO(tm_blend_scale_center, 0.3) /* scale factor for full screen blend intensity, at screen center */ \ + UBO_CVAR_DO(tm_blend_scale_center, 0.6) /* scale factor for full screen blend intensity, at screen center */ \ UBO_CVAR_DO(tm_blend_scale_fade_exp, 4) /* exponent used to interpolate between "border" and "center" factors */ \ UBO_CVAR_DO(tm_high_percentile, 90) /* high percentile for computing histogram average, (0..100] */ \ UBO_CVAR_DO(tm_knee_start, 0.6) /* where to switch from a linear to a rational function ramp in the post-tonemapping process, (0..1) */ \ diff --git a/src/refresh/vkpt/shader/tone_mapping_apply.comp b/src/refresh/vkpt/shader/tone_mapping_apply.comp index a35c39e45..f6f208996 100644 --- a/src/refresh/vkpt/shader/tone_mapping_apply.comp +++ b/src/refresh/vkpt/shader/tone_mapping_apply.comp @@ -131,9 +131,9 @@ void main() vec3 input_color = imageLoad(IMG_TAA_OUTPUT, ipos).rgb; input_color /= STORAGE_SCALE_HDR; - // Mix in full screen blend color + // Mix in full screen blend color. Scale it up so it's noticeable against bright pixels as well. vec4 blend_color = global_ubo.fs_blend_color; - blend_color.rgb *= global_ubo.prev_adapted_luminance; + blend_color.rgb *= tonemap_buffer.adapted_luminance / max(luminance(blend_color.rgb), exp2(min_log_luminance)); // Fade strength of blend effect between center and border vec2 norm_pos = (vec2(ipos) / vec2(screenSize) - vec2(0.5)) * vec2(2);