[orx-fx] Correct BlendSpectral

This commit is contained in:
Edwin Jakobs
2023-12-15 01:03:34 +01:00
parent d2cd12a0b0
commit 39055254c6
2 changed files with 24 additions and 14 deletions

View File

@@ -42,32 +42,40 @@ vec3 linear_to_srgb(vec3 c) {
void main() {
vec4 a = texture(tex0, v_texCoord0);
vec4 b = texture(tex1, v_texCoord0);
// depremultiply alpha
vec4 na = a.a == 0.0 ? vec4(0.0): vec4(a.rgb / a.a,a.a);
vec4 nb = b.a == 0.0 ? vec4(0.0): vec4(b.rgb / b.a,b.a);
if (linearizeInputA) {
a.rgb = srgb_to_linear(a.rgb);
na.rgb = srgb_to_linear(na.rgb);
}
if (linearizeInputB) {
b.rgb = srgb_to_linear(b.rgb);
nb.rgb = srgb_to_linear(nb.rgb);
}
// depremultiply alpha
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;
vec4 mixed = vec4(spectral_mix(na.rgb, nb.rgb, min(1.0, fill)), 1.0);
vec4 mixed = vec4(spectral_mix(na, nb, min(1.0, b.a * fill) ), min(a.a, b.a));
// premultiply alpha
mixed.rgb *= mixed.a;
if (!clip) {
vec4 b_over_a = a * (1.0 - b.a) + b;
mixed = b_over_a * (1.0-mixed.a) + mixed;
na.rgb *= a.a;
nb.rgb *= b.a;
mixed = na * (1.0 - nb.a) + nb * (1.0 - na.a) + mixed * na.a * nb.a;
} else {
mixed = mixed * na.a * nb.a;
}
mixed.rgb = mixed.a == 0.0 ? vec3(0.0): mixed.rgb / mixed.a;
if (delinearizeOutput) {
mixed.rgb = linear_to_srgb(mixed.rgb);
}
// premultiply alpha
mixed.rgb *= mixed.a;
o_color = mixed;
}

View File

@@ -3,6 +3,7 @@ import org.openrndr.color.ColorRGBa
import org.openrndr.draw.createEquivalent
import org.openrndr.drawImage
import org.openrndr.extra.fx.blend.BlendSpectral
import org.openrndr.extra.fx.blur.BoxBlur
import org.openrndr.extra.fx.patterns.Checkers
import org.openrndr.math.Vector2
import kotlin.math.sin
@@ -17,7 +18,7 @@ fun main() {
val a = drawImage(width, height) {
drawer.stroke = null
drawer.fill = ColorRGBa.BLUE
drawer.circle(drawer.bounds.center - Vector2(100.0, 0.0) , drawer.width * 0.25)
drawer.circle(drawer.bounds.center - Vector2(100.0, 0.0), drawer.width * 0.25)
}
val b = drawImage(width, height) {
drawer.clear(ColorRGBa.TRANSPARENT)
@@ -26,7 +27,7 @@ fun main() {
drawer.fill = ColorRGBa.YELLOW.opacify(1.0)
drawer.circle(drawer.bounds.center + Vector2(100.0, 0.0), drawer.width * 0.25)
}
BoxBlur().apply { window = 10 }.apply(b, b)
val checked = a.createEquivalent()
Checkers().apply(emptyArray(), checked)
@@ -35,6 +36,7 @@ fun main() {
extend {
drawer.image(checked)
blendSpectral.fill = sin(seconds) * 0.5 + 0.5
blendSpectral.clip = seconds.mod(4.0) > 2.0
blendSpectral.apply(a, b, mixed)
drawer.image(mixed)
}