From 0ec7ddeba81fd6c988a7ff91f4ae6dc272dfd439 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Tue, 11 May 2021 09:07:06 -0700 Subject: [PATCH] Blend premultiplied colors Mixing alpha blended colors, and then premultiplying them in the end was causing artifacts on the sparkles. Bug: 187824279 Test: visual Change-Id: Icde12c3fa737f597f18f2705eefa687a49a19445 --- .../graphics/drawable/RippleShader.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/graphics/java/android/graphics/drawable/RippleShader.java b/graphics/java/android/graphics/drawable/RippleShader.java index d00492cedb38d..6c0981afa2c99 100644 --- a/graphics/java/android/graphics/drawable/RippleShader.java +++ b/graphics/java/android/graphics/drawable/RippleShader.java @@ -43,10 +43,10 @@ final class RippleShader extends RuntimeShader { + "uniform shader in_shader;\n"; private static final String SHADER_LIB = "float triangleNoise(vec2 n) {\n" - + " n = fract(n * vec2(5.3987, 5.4421));\n" - + " n += dot(n.yx, n.xy + vec2(21.5351, 14.3137));\n" - + " float xy = n.x * n.y;\n" - + " return fract(xy * 95.4307) + fract(xy * 75.04961) - 1.0;\n" + + " n = fract(n * vec2(5.3987, 5.4421));\n" + + " n += dot(n.yx, n.xy + vec2(21.5351, 14.3137));\n" + + " float xy = n.x * n.y;\n" + + " return fract(xy * 95.4307) + fract(xy * 75.04961) - 1.0;\n" + "}" + "const float PI = 3.1415926535897932384626;\n" + "\n" @@ -110,14 +110,16 @@ final class RippleShader extends RuntimeShader { + " vec2 uv = p * in_resolutionScale;\n" + " vec2 densityUv = uv - mod(uv, in_noiseScale);\n" + " float turbulence = turbulence(uv, in_turbulencePhase);\n" - + " float sparkle = sparkles(densityUv, in_noisePhase) * ring * alpha " + + " float sparkleAlpha = sparkles(densityUv, in_noisePhase) * ring * alpha " + "* turbulence;\n" + " float fade = min(fadeIn, 1. - fadeOutRipple);\n" - + " float circleAlpha = softCircle(p, center, in_maxRadius * scaleIn, 0.2) * fade;\n" - + " vec3 color = mix(in_color.rgb, in_sparkleColor.rgb, sparkle);\n" + + " float waveAlpha = softCircle(p, center, in_maxRadius * scaleIn, 0.2) * fade " + + "* in_color.a;\n" + + " vec4 waveColor = vec4(in_color.rgb * waveAlpha, waveAlpha);\n" + + " vec4 sparkleColor = vec4(in_sparkleColor.rgb * in_sparkleColor.a, " + + "in_sparkleColor.a);\n" + " float mask = in_hasMask == 1. ? sample(in_shader, p).a > 0. ? 1. : 0. : 1.;\n" - + " float a = (in_color.a * circleAlpha + in_sparkleColor.a * sparkle) * mask;\n" - + " return vec4(color * a, a);\n" + + " return mix(waveColor, sparkleColor, sparkleAlpha) * mask;\n" + "}"; private static final String SHADER = SHADER_UNIFORMS + SHADER_LIB + SHADER_MAIN; private static final double PI_ROTATE_RIGHT = Math.PI * 0.0078125;