From 60b260330429d37acb2a09cf9976e3a3aad81ccb Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 24 Feb 2023 08:39:55 -0800 Subject: [PATCH] metal: premult alpha for fg color --- src/renderer/Metal.zig | 4 ++-- src/renderer/shaders/cell.metal | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/renderer/Metal.zig b/src/renderer/Metal.zig index abd8ad06a..5157befc9 100644 --- a/src/renderer/Metal.zig +++ b/src/renderer/Metal.zig @@ -1299,8 +1299,8 @@ fn initPipelineState(device: objc.Object, library: objc.Object) !objc.Object { attachment.setProperty("blendingEnabled", true); attachment.setProperty("rgbBlendOperation", @enumToInt(MTLBlendOperation.add)); attachment.setProperty("alphaBlendOperation", @enumToInt(MTLBlendOperation.add)); - attachment.setProperty("sourceRGBBlendFactor", @enumToInt(MTLBlendFactor.source_alpha)); - attachment.setProperty("sourceAlphaBlendFactor", @enumToInt(MTLBlendFactor.source_alpha)); + attachment.setProperty("sourceRGBBlendFactor", @enumToInt(MTLBlendFactor.one)); + attachment.setProperty("sourceAlphaBlendFactor", @enumToInt(MTLBlendFactor.one)); attachment.setProperty("destinationRGBBlendFactor", @enumToInt(MTLBlendFactor.one_minus_source_alpha)); attachment.setProperty("destinationAlphaBlendFactor", @enumToInt(MTLBlendFactor.one_minus_source_alpha)); } diff --git a/src/renderer/shaders/cell.metal b/src/renderer/shaders/cell.metal index f92b7e529..8d1119b0c 100644 --- a/src/renderer/shaders/cell.metal +++ b/src/renderer/shaders/cell.metal @@ -188,8 +188,10 @@ fragment float4 uber_fragment( float2 size = float2(textureGreyscale.get_width(), textureGreyscale.get_height()); float2 coord = in.tex_coord / size; + // We premult the alpha to our whole color since our blend function + // uses One/OneMinusSourceAlpha to avoid blurry edges. float a = textureGreyscale.sample(textureSampler, coord).r; - return float4(in.color.rgb, in.color.a * a); + return in.color * a; } case MODE_FG_COLOR: {