Fix opacity handling for blend filters in orx-fx

This commit is contained in:
Edwin Jakobs
2020-02-09 16:10:59 +01:00
parent 6c48cf2e83
commit 61507b525f
16 changed files with 74 additions and 179 deletions

View File

@@ -8,22 +8,7 @@ out vec4 o_color;
void main() {
vec4 a = texture(tex0, v_texCoord0);
vec4 b = texture(tex1, v_texCoord0);
vec3 na = a.a == 0.0 ? a.rgb: a.rgb / a.a;
vec3 nb = b.a == 0.0 ? b.rgb: b.rgb / b.a;
float minAlpha = min(a.a, b.a);
float maxAlpha = max(a.a, b.a);
vec3 ka = mix(vec3(0.0), na.rgb, a.a);
vec3 kb = mix(vec3(0.0), nb.rgb, b.a);
vec4 m = vec4(ka+kb, 1.0) * maxAlpha;
vec4 l = a;
l = l * (1.0 - b.a) + b;
l = l * (1.0 - m.a) + m;
o_color = l;
o_color.a = maxAlpha;
vec3 na = a.a > 0 ? a.rgb/a.a : vec3(0.0);
vec3 addColor = b.rgb; //mix(vec3(0.0), nb, b.a);
o_color = vec4((na + addColor), 1) * a.a;
}

View File

@@ -5,35 +5,22 @@ uniform sampler2D tex0;
uniform sampler2D tex1;
float blendColorBurn(float base, float blend) {
return (blend==0.0)?blend:max((1.0-((1.0-base)/blend)),0.0);
return (blend==0.0) ? blend : max((1.0 - ((1.0 - base) / blend)), 0.0);
}
out vec4 o_color;
void main() {
vec4 a = texture(tex0, v_texCoord0);
vec4 b = texture(tex1, v_texCoord0);
vec3 na = a.a == 0.0 ? vec3(0.0): a.rgb / a.a;
vec3 nb = b.a == 0.0 ? b.rgb: b.rgb / b.a;
vec3 nb = b.a == 0.0 ? vec3(0.0): b.rgb / b.a;
float minAlpha = min(a.a, b.a);
float maxAlpha = max(a.a, b.a);
vec3 m = vec3(
blendColorBurn(na.r, nb.r),
blendColorBurn(na.g, nb.g),
blendColorBurn(na.b, nb.b)
);
vec3 ka = mix(vec3(0.0), na.rgb, a.a);
vec3 kb = mix(vec3(1.0), nb.rgb, b.a);
vec4 m = vec4(
blendColorBurn(ka.r, kb.r),
blendColorBurn(ka.g, kb.g),
blendColorBurn(ka.b, kb.b),
1.0
) * maxAlpha;
vec4 l = a;
l = l * (1.0 - b.a) + b;
l = l * (1.0 - m.a) + m;
o_color = l;
o_color.a = maxAlpha;
o_color = vec4(na * (1.0 - b.a) + b.a * m, 1.0) * a.a;
}

View File

@@ -16,22 +16,11 @@ void main() {
vec3 na = a.a == 0.0 ? vec3(0.0): a.rgb / a.a;
vec3 nb = b.a == 0.0 ? vec3(0.0): b.rgb / b.a;
float minAlpha = min(a.a, b.a);
float maxAlpha = max(a.a, b.a);
vec3 m = vec3(
dodge(na.r, nb.r),
dodge(na.g, nb.g),
dodge(na.b, nb.b)
);
vec3 ka = mix(vec3(0.0), na.rgb, a.a);
vec3 kb = mix(vec3(0.0), nb.rgb, b.a);
vec4 m = vec4(
dodge(ka.r, kb.r),
dodge(ka.g, kb.g),
dodge(ka.b, kb.b),
1.0
) * maxAlpha;
vec4 l = a;
l = l * (1.0 - b.a) + b;
l = l * (1.0 - m.a) + m;
o_color = l;
o_color.a = maxAlpha;
o_color = vec4(na * (1.0 - b.a) + b.a * m, 1.0) * a.a;
}

View File

@@ -12,23 +12,10 @@ void main() {
vec3 na = a.a == 0.0 ? vec3(0.0): a.rgb / a.a;
vec3 nb = b.a == 0.0 ? vec3(0.0): b.rgb / b.a;
float minAlpha = min(a.a, b.a);
float maxAlpha = max(a.a, b.a);
vec3 m = vec3(
nb.r <= na.r? nb.r : na.r,
nb.g <= na.g? nb.g : na.g,
nb.b <= na.b? nb.b : na.b);
vec3 ka = mix(vec3(0.0), na.rgb, a.a);
vec3 kb = mix(na.rgb, nb.rgb, b.a);
vec4 m = vec4(
kb.r <= ka.r? kb.r : ka.r,
kb.g <= ka.g? kb.g : ka.g,
kb.b <= ka.b? kb.b : ka.b,
1.0
) * maxAlpha;
vec4 l = a;
l = l * (1.0 - b.a) + b;
l = l * (1.0 - m.a) + m;
o_color = l;
o_color.a = maxAlpha;
o_color = vec4(na * (1.0 - b.a) + b.a * m, 1.0) * a.a;
}

View File

@@ -10,6 +10,6 @@ void main() {
vec4 a = texture(tex0, v_texCoord0);
vec4 b = texture(tex1, v_texCoord0);
o_color.rgb = a.rgb;
o_color.a = b.a;
vec3 na = a.a == 0.0 ? vec3(0.0): a.rgb / a.a;
o_color = vec4(na, 1.0) * b.a * a.a;
}

View File

@@ -9,6 +9,6 @@ void main() {
vec4 a = texture(tex0, v_texCoord0);
vec4 b = texture(tex1, v_texCoord0);
o_color.rgb = a.rgb;
o_color.a = max(a.a - b.a, 0.0);
vec3 na = a.a == 0.0 ? vec3(0.0): a.rgb / a.a;
o_color = vec4(na, 1.0) * max(a.a - b.a, 0.0);
}

View File

@@ -12,22 +12,11 @@ void main() {
vec3 na = a.a == 0.0 ? vec3(0.0): a.rgb / a.a;
vec3 nb = b.a == 0.0 ? vec3(0.0): b.rgb / b.a;
float minAlpha = min(a.a, b.a);
float maxAlpha = max(a.a, b.a);
vec3 m = vec3(
nb.r <= 0.5? 2*na.r * nb.r : 1.0 - 2.0*(1.0 - na.r)*(1.0 - nb.r),
nb.g <= 0.5? 2*na.g * nb.g : 1.0 - 2.0*(1.0 - na.g)*(1.0 - nb.g),
nb.b <= 0.5? 2*na.b * nb.b : 1.0 - 2.0*(1.0 - na.b)*(1.0 - nb.b)
);
o_color = vec4(na * (1.0 - b.a) + b.a * m, 1.0) * a.a;
vec3 ka = mix(vec3(0.0), na.rgb, a.a);
vec3 kb = mix(vec3(0.5), nb.rgb, b.a);
vec4 m = vec4(
kb.r <= 0.5? 2*ka.r * kb.r : 1.0 - 2.0*(1.0 - ka.r)*(1.0 - kb.r),
kb.g <= 0.5? 2*ka.g * kb.g : 1.0 - 2.0*(1.0 - ka.g)*(1.0 - kb.g),
kb.b <= 0.5? 2*ka.b * kb.b : 1.0 - 2.0*(1.0 - ka.b)*(1.0 - kb.b),
1.0
) * maxAlpha;
vec4 l = a;
l = l * (1.0 - b.a) + b;
l = l * (1.0 - m.a) + m;
o_color = l;
o_color.a = maxAlpha;
}

View File

@@ -12,23 +12,10 @@ void main() {
vec3 na = a.a == 0.0 ? vec3(0.0): a.rgb / a.a;
vec3 nb = b.a == 0.0 ? vec3(0.0): b.rgb / b.a;
float minAlpha = min(a.a, b.a);
float maxAlpha = max(a.a, b.a);
vec3 m = vec3(
nb.r >= na.r? nb.r : na.r,
nb.g >= na.g? nb.g : na.g,
nb.b >= na.b? nb.b : na.b);
vec3 ka = mix(vec3(0.0), na.rgb, a.a);
vec3 kb = mix(na.rgb, nb.rgb, b.a);
vec4 m = vec4(
kb.r >= ka.r? kb.r : ka.r,
kb.g >= ka.g? kb.g : ka.g,
kb.b >= ka.b? kb.b : ka.b,
1.0
) * maxAlpha;
vec4 l = a;
l = l * (1.0 - b.a) + b;
l = l * (1.0 - m.a) + m;
o_color = l;
o_color.a = maxAlpha;
o_color = vec4(na * (1.0 - b.a) + b.a * m, 1.0) * a.a;
}

View File

@@ -8,23 +8,8 @@ out vec4 o_color;
void main() {
vec4 a = texture(tex0, v_texCoord0);
vec4 b = texture(tex1, v_texCoord0);
vec3 na = a.a == 0.0 ? a.rgb: a.rgb / a.a;
vec3 nb = b.a == 0.0 ? b.rgb: b.rgb / b.a;
float minAlpha = min(a.a, b.a);
float maxAlpha = max(a.a, b.a);
vec3 ka = mix(vec3(1.0), na.rgb, a.a);
vec3 kb = mix(vec3(1.0), nb.rgb, b.a);
vec4 m = vec4(ka*kb, 1.0) * maxAlpha;
vec4 l = a;
l = l * (1.0 - b.a) + b;
l = l * (1.0 - m.a) + m;
o_color = l;
o_color.a = maxAlpha;
vec3 nb = b.a > 0 ? b.rgb/b.a : vec3(0.0);
vec3 mulColor = mix(vec3(1.0), nb, b.a);
o_color = vec4(a.rgb * mulColor, a.a);
}

View File

@@ -11,5 +11,5 @@ void main() {
float alpha = min(1,max(0, b.a));
o_color = a * (1.0-alpha) + b;
o_color.a = 1.0;
o_color.a = clamp(o_color.a, 0.0, 1.0);
}

View File

@@ -6,18 +6,29 @@ uniform sampler2D tex0;
uniform sampler2D tex1;
out vec4 o_color;
vec3 demul(vec4 c) {
if (c.a == 0) {
return vec3(0.0);
} else {
return c.rgb / c.a;
}
}
void main() {
vec4 a = texture(tex0, v_texCoord0);
vec4 b = texture(tex1, v_texCoord0);
vec3 na = demul(a);
vec3 nb = demul(b);
vec4 c = vec4(
a.r <= 0.5? 2.0*a.r * b.r : 1.0 - 2.0*(1.0-a.r)*(1.0-b.r),
a.g <= 0.5? 2.0*a.g * b.g : 1.0 - 2.0*(1.0-a.g)*(1.0-b.g),
a.b <= 0.5? 2.0*a.b * b.b : 1.0 - 2.0*(1.0-a.b)*(1.0-b.b),
na.r <= 0.5? 2.0 * na.r * nb.r : (1.0 - 2.0 * (1.0 - na.r) * (1.0 - nb.r)),
na.g <= 0.5? 2.0 * na.g * nb.g : (1.0 - 2.0 * (1.0 - na.g) * (1.0 - nb.g)),
na.b <= 0.5? 2.0 * na.b * nb.b : (1.0 - 2.0 * (1.0 - na.b) * (1.0 - nb.b)),
1.0
);
vec4 d = a * (1.0 - b.a) + c * b.a;
o_color = max(vec4(0), min(vec4(1), d));
o_color.a = 1.0;
vec3 fc = na * (1.0 - b.a) + c.rgb * b.a;
o_color = vec4(fc, 1.0) * a.a;
}

View File

@@ -12,22 +12,10 @@ void main() {
vec3 na = a.a == 0.0 ? vec3(0.0): a.rgb / a.a;
vec3 nb = b.a == 0.0 ? vec3(0.0): b.rgb / b.a;
float minAlpha = min(a.a, b.a);
float maxAlpha = max(a.a, b.a);
vec3 m = vec3(
1.0-((1.0-na.r)*(1.0-nb.r)),
1.0-((1.0-na.g)*(1.0-nb.g)),
1.0-((1.0-na.b)*(1.0-nb.b)));
vec3 ka = mix(vec3(0.0), na.rgb, a.a);
vec3 kb = mix(na.rgb, nb.rgb, b.a);
vec4 m = vec4(
1.0-((1.0-ka.r)*(1.0-kb.r)),
1.0-((1.0-ka.g)*(1.0-kb.g)),
1.0-((1.0-ka.b)*(1.0-kb.b)),
1.0
) * maxAlpha;
vec4 l = a;
l = l * (1.0 - b.a) + b;
l = l * (1.0 - m.a) + m;
o_color = l;
o_color.a = maxAlpha;
o_color = vec4(na * (1.0 - b.a) + b.a * m, 1.0) * a.a;
}

View File

@@ -9,6 +9,6 @@ void main() {
vec4 a = texture(tex0, v_texCoord0);
vec4 b = texture(tex1, v_texCoord0);
o_color.rgb = b.rgb;
o_color.a = a.a;
vec3 nb = b.a == 0.0 ? vec3(0.0): b.rgb / b.a;
o_color = vec4(nb, 1.0) * a.a * b.a;
}

View File

@@ -9,6 +9,6 @@ void main() {
vec4 a = texture(tex0, v_texCoord0);
vec4 b = texture(tex1, v_texCoord0);
o_color.rgb = b.rgb;
o_color.a = max(b.a - a.a, 0.0);
vec3 nb = b.a == 0.0 ? vec3(0.0): b.rgb / b.a;
o_color = vec4(nb, 1.0) * max(b.a - a.a, 0.0);
}

View File

@@ -8,22 +8,7 @@ out vec4 o_color;
void main() {
vec4 a = texture(tex0, v_texCoord0);
vec4 b = texture(tex1, v_texCoord0);
vec3 na = a.a == 0.0 ? a.rgb: a.rgb / a.a;
vec3 nb = b.a == 0.0 ? b.rgb: b.rgb / b.a;
float minAlpha = min(a.a, b.a);
float maxAlpha = max(a.a, b.a);
vec3 ka = mix(vec3(0.0), na.rgb, a.a);
vec3 kb = mix(vec3(0.0), nb.rgb, b.a);
vec4 m = vec4(na-kb, 1.0) * maxAlpha;
vec4 l = a;
l = l * (1.0 - b.a) + b;
l = l * (1.0 - m.a) + m;
o_color = l;
o_color.a = maxAlpha;
vec3 na = a.a > 0 ? a.rgb/a.a : vec3(0.0);
vec3 subColor = b.rgb;
o_color = vec4(max(na - subColor, vec3(0.0)), 1) * a.a;
}

View File

@@ -10,12 +10,14 @@ void main() {
vec4 b = texture(tex1, v_texCoord0);
vec4 color = vec4(0.0);
vec3 na = a.a == 0.0 ? vec3(0.0) : a.rgb/a.a;
vec3 nb = b.a == 0.0 ? vec3(0.0) : b.rgb/b.a;
if (a.a > b.a) {
color = a;
color = vec4(na, 1.0) * (b.a == 0.0? a.a : (1.0-b.a));
}
if (b.a > a.a) {
color = b;
color = vec4(nb, 1.0) * (a.a == 0.0? b.a : (1.0-a.a));
}
o_color = color;