From d9345f4d9c8c5c077784b0c07c9cca789d19de67 Mon Sep 17 00:00:00 2001 From: Alexander Orzechowski Date: Sat, 24 Aug 2024 15:56:47 -0400 Subject: [PATCH] render/vulkan: Unify pre-multiplied alpha handling in output shader --- render/vulkan/shaders/output.frag | 42 ++++++++++++------------------- 1 file changed, 16 insertions(+), 26 deletions(-) diff --git a/render/vulkan/shaders/output.frag b/render/vulkan/shaders/output.frag index 2a744aa24..243b9ee24 100644 --- a/render/vulkan/shaders/output.frag +++ b/render/vulkan/shaders/output.frag @@ -23,38 +23,28 @@ float linear_channel_to_srgb(float x) { return max(min(x * 12.92, 0.04045), 1.055 * pow(x, 1. / 2.4) - 0.055); } -vec4 linear_color_to_srgb(vec4 color) { - if (color.a == 0) { - return vec4(0); - } - color.rgb /= color.a; - color.rgb = vec3( - linear_channel_to_srgb(color.r), - linear_channel_to_srgb(color.g), - linear_channel_to_srgb(color.b) - ); - color.rgb *= color.a; - return color; -} - void main() { vec4 val = subpassLoad(in_color).rgba; - if (OUTPUT_TRANSFORM == OUTPUT_TRANSFORM_LUT_3D) { - if (val.a == 0) { - out_color = vec4(0); - return; - } - // Convert from pre-multiplied alpha to straight alpha - vec3 rgb = val.rgb / val.a; + if (val.a == 0) { + out_color = vec4(0); + return; + } + // Convert from pre-multiplied alpha to straight alpha + vec3 rgb = val.rgb / val.a; + + if (OUTPUT_TRANSFORM == OUTPUT_TRANSFORM_LUT_3D) { // Apply 3D LUT vec3 pos = data.lut_3d_offset + rgb * data.lut_3d_scale; rgb = texture(lut_3d, pos).rgb; - - // Back to pre-multiplied alpha - out_color = vec4(rgb * val.a, val.a); } else { // OUTPUT_TRANSFORM_INVERSE_SRGB - // Produce post-premultiplied sRGB encoded values - out_color = linear_color_to_srgb(val); + rgb = vec3( + linear_channel_to_srgb(rgb.r), + linear_channel_to_srgb(rgb.g), + linear_channel_to_srgb(rgb.b) + ); } + + // Back to pre-multiplied alpha + out_color = vec4(rgb * val.a, val.a); }