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:
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
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue