From 61507b525f1687abcbe5a35ae2c4809c4f24f3f6 Mon Sep 17 00:00:00 2001 From: Edwin Jakobs Date: Sun, 9 Feb 2020 16:10:59 +0100 Subject: [PATCH] Fix opacity handling for blend filters in orx-fx --- .../org/openrndr/extra/fx/gl3/blend/add.frag | 21 ++------------ .../extra/fx/gl3/blend/color-burn.frag | 29 +++++-------------- .../extra/fx/gl3/blend/color-dodge.frag | 23 ++++----------- .../openrndr/extra/fx/gl3/blend/darken.frag | 23 ++++----------- .../extra/fx/gl3/blend/destination-in.frag | 4 +-- .../extra/fx/gl3/blend/destination-out.frag | 4 +-- .../extra/fx/gl3/blend/hard-light.frag | 23 ++++----------- .../openrndr/extra/fx/gl3/blend/lighten.frag | 23 ++++----------- .../openrndr/extra/fx/gl3/blend/multiply.frag | 21 ++------------ .../openrndr/extra/fx/gl3/blend/normal.frag | 2 +- .../openrndr/extra/fx/gl3/blend/overlay.frag | 23 +++++++++++---- .../openrndr/extra/fx/gl3/blend/screen.frag | 22 ++++---------- .../extra/fx/gl3/blend/source-in.frag | 4 +-- .../extra/fx/gl3/blend/source-out.frag | 4 +-- .../openrndr/extra/fx/gl3/blend/subtract.frag | 21 ++------------ .../org/openrndr/extra/fx/gl3/blend/xor.frag | 6 ++-- 16 files changed, 74 insertions(+), 179 deletions(-) diff --git a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/add.frag b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/add.frag index fbafb892..e7b50217 100644 --- a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/add.frag +++ b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/add.frag @@ -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; } \ No newline at end of file diff --git a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/color-burn.frag b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/color-burn.frag index e6835d00..506b18ae 100644 --- a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/color-burn.frag +++ b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/color-burn.frag @@ -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; } \ No newline at end of file diff --git a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/color-dodge.frag b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/color-dodge.frag index 492ec947..17c9edf0 100644 --- a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/color-dodge.frag +++ b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/color-dodge.frag @@ -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; } \ No newline at end of file diff --git a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/darken.frag b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/darken.frag index d9d70cc1..39e0d942 100644 --- a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/darken.frag +++ b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/darken.frag @@ -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; } \ No newline at end of file diff --git a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/destination-in.frag b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/destination-in.frag index 77f80163..17783e68 100644 --- a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/destination-in.frag +++ b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/destination-in.frag @@ -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; } \ No newline at end of file diff --git a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/destination-out.frag b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/destination-out.frag index 0284d9d7..7060fac8 100644 --- a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/destination-out.frag +++ b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/destination-out.frag @@ -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); } \ No newline at end of file diff --git a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/hard-light.frag b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/hard-light.frag index 247bafe9..ad05e06d 100644 --- a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/hard-light.frag +++ b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/hard-light.frag @@ -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; } \ No newline at end of file diff --git a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/lighten.frag b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/lighten.frag index b1cad6cb..e5f91610 100644 --- a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/lighten.frag +++ b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/lighten.frag @@ -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; } \ No newline at end of file diff --git a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/multiply.frag b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/multiply.frag index 39f61573..d4c3e43e 100644 --- a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/multiply.frag +++ b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/multiply.frag @@ -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); } diff --git a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/normal.frag b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/normal.frag index 29e075b9..5a7403a4 100644 --- a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/normal.frag +++ b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/normal.frag @@ -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); } \ No newline at end of file diff --git a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/overlay.frag b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/overlay.frag index c7cb3e65..9690ce2d 100644 --- a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/overlay.frag +++ b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/overlay.frag @@ -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; } \ No newline at end of file diff --git a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/screen.frag b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/screen.frag index 1d3e7976..ecb3c187 100644 --- a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/screen.frag +++ b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/screen.frag @@ -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; } \ No newline at end of file diff --git a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/source-in.frag b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/source-in.frag index a9e92c5f..112b13bb 100644 --- a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/source-in.frag +++ b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/source-in.frag @@ -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; } \ No newline at end of file diff --git a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/source-out.frag b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/source-out.frag index 96a8a077..86c9e2f1 100644 --- a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/source-out.frag +++ b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/source-out.frag @@ -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); } \ No newline at end of file diff --git a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/subtract.frag b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/subtract.frag index e9a9ef06..f19a5c69 100644 --- a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/subtract.frag +++ b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/subtract.frag @@ -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; } \ No newline at end of file diff --git a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/xor.frag b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/xor.frag index 7419da5d..c0ead762 100644 --- a/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/xor.frag +++ b/orx-fx/src/main/resources/org/openrndr/extra/fx/gl3/blend/xor.frag @@ -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;