Fix T65187: Overlay blend increase wrongly the opacity

The calculation of the mix color was not using the bottom color when the alpha was lower than 1.0.

Also added clamp code to avoid values outside valid ranges.
This commit is contained in:
Antonio Vazquez 2019-05-28 15:55:17 +02:00
parent 5778e616e5
commit f139caa632
Notes: blender-bot 2023-02-14 08:42:54 +01:00
Referenced by issue #65187, [Grease Pencil] Overlay, subtract, multiply and divide Layer Blend modes don't blend right
1 changed files with 6 additions and 7 deletions

View File

@ -43,39 +43,38 @@ vec4 get_blend_color(int mode, vec4 src_color, vec4 blend_color)
outcolor = src_color;
}
else if (mode == MODE_OVERLAY) {
mix_color.rgb = mix_color.rgb * mix_color.a * blend_opacity;
mix_color.rgb = mix(src_color.rgb, mix_color.rgb, mix_color.a * blend_opacity);
outcolor.r = overlay_color(src_color.r, mix_color.r);
outcolor.g = overlay_color(src_color.g, mix_color.g);
outcolor.b = overlay_color(src_color.b, mix_color.b);
outcolor.a = src_color.a;
}
else if (mode == MODE_ADD) {
mix_color.rgb = mix_color.rgb * mix_color.a * blend_opacity;
mix_color.rgb = mix(src_color.rgb, mix_color.rgb, mix_color.a * blend_opacity);
outcolor = src_color + mix_color;
outcolor.a = src_color.a;
}
else if (mode == MODE_SUB) {
mix_color.rgb = mix(src_color.rgb, mix_color.rgb, mix_color.a * blend_opacity);
outcolor = src_color - mix_color;
outcolor.a = clamp(src_color.a - (mix_color.a * blend_opacity), 0.0, 1.0);
}
else if (mode == MODE_MULTIPLY) {
/* interpolate between 1 and color using opacity */
mix_color.rgb = mix(vec3(1, 1, 1), mix_color.rgb * mix_color.a, blend_opacity);
mix_color.rgb = mix(src_color.rgb, mix_color.rgb, mix_color.a * blend_opacity);
outcolor = src_color * mix_color;
outcolor.a = src_color.a;
}
else if (mode == MODE_DIVIDE) {
mix_color.rgb = mix_color.rgb * mix_color.a * blend_opacity;
mix_color.rgb = mix(src_color.rgb, mix_color.rgb, mix_color.a * blend_opacity);
outcolor = src_color / mix_color;
outcolor.a = src_color.a;
}
else {
outcolor = mix_color * blend_opacity;
;
outcolor.a = src_color.a;
}
return outcolor;
return clamp(outcolor, 0.0, 1.0);
}
float linearrgb_to_srgb(float c)