1
0
Fork 0
mirror of https://github.com/Orama-Interactive/Pixelorama.git synced 2025-01-18 17:19:50 +00:00

Make alpha affect all of the blend modes besides Normal and Screen

This commit is contained in:
Emmanouil Papadeas 2024-02-09 20:09:25 +02:00
parent bec6dfc256
commit 8b91d95258

View file

@ -55,11 +55,11 @@ vec3 rgb_to_hsl(vec3 rgb)
vec4 blend(int blend_type, vec4 current_color, vec4 prev_color, float opacity) {
if (current_color.a <= 0.001 || opacity <= 0.001) {
current_color.a *= opacity; // Combine the layer opacity
if (current_color.a <= 0.001) {
return prev_color;
}
vec4 result;
current_color.a *= opacity; // Combine the layer opacity
switch(blend_type) {
case 1: // Darken
result.rgb = min(prev_color.rgb, current_color.rgb);
@ -77,7 +77,7 @@ vec4 blend(int blend_type, vec4 current_color, vec4 prev_color, float opacity) {
result.rgb = max(prev_color.rgb, current_color.rgb);
break;
case 6: // Screen
result.rgb = mix(prev_color.rgb, 1.0 - (1.0 - prev_color.rgb) * (1.0 - current_color.rgb), current_color.a);
result.rgb = 1.0 - (1.0 - prev_color.rgb) * (1.0 - current_color.rgb);
break;
case 7: // Color dodge
result.rgb = prev_color.rgb / (1.0 - current_color.rgb);
@ -127,9 +127,10 @@ vec4 blend(int blend_type, vec4 current_color, vec4 prev_color, float opacity) {
result.rgb = hsl_to_rgb(vec3(prev_hsl.r, prev_hsl.g, current_hsl.b));
break;
default: // Normal (case 0)
result.rgb = mix(prev_color.rgb, current_color.rgb, current_color.a);
result.rgb = current_color.rgb;
break;
}
result.rgb = mix(prev_color.rgb, result.rgb, current_color.a);
result.a = prev_color.a * (1.0 - current_color.a) + current_color.a;
result = clamp(result, 0.0, 1.0);
return mix(current_color, result, prev_color.a);