Skip to content

Commit

Permalink
fix(Metal): fix incorrect premultiplication of colors
Browse files Browse the repository at this point in the history
Also make sure to divide alpha out before applying gamma encoding back
to text color when not using linear blending.
  • Loading branch information
qwerasd205 committed Jan 17, 2025
1 parent a185ce3 commit 2a1b51e
Showing 1 changed file with 6 additions and 6 deletions.
12 changes: 6 additions & 6 deletions src/renderer/shaders/cell.metal
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ float4 load_color(
// already have the correct color here and
// can premultiply and return it.
if (display_p3 && !linear) {
color *= color.a;
color.rgb *= color.a;
return color;
}

Expand Down Expand Up @@ -167,7 +167,7 @@ float4 load_color(
}

// Premultiply our color by its alpha.
color *= color.a;
color.rgb *= color.a;

return color;
}
Expand Down Expand Up @@ -503,12 +503,12 @@ fragment float4 cell_text_fragment(
// If we're not doing linear blending, then we need to
// re-apply the gamma encoding to our color manually.
//
// We do it BEFORE premultiplying the alpha because
// we want to produce the effect of not linearizing
// it in the first place in order to match the look
// of software that never does this.
// Since the alpha is premultiplied, we need to divide
// it out before unlinearizing and re-multiply it after.
if (!uniforms.use_linear_blending) {
color.rgb /= color.a;
color = unlinearize(color);
color.rgb *= color.a;
}

// Fetch our alpha mask for this pixel.
Expand Down

0 comments on commit 2a1b51e

Please sign in to comment.