In the post Rendering UI transitions on mobile, I mentioned a problem with my transition shader on Adreno 330 GPUs. The solution was pretty easy. I’ve just unrolled the for-loop (and reduced the number of taps, but this is another story). Here is the new code for main() in the fragment shader which works on Adreno perfectly:
void main(void) { float T = u_TransitionValue; float S0 = 1.0; float S1 = u_PixelSize; float S2 = 1.0; // 2 segments, 1/2 each float Half = 0.5; float PixelSize = ( T < Half ) ? mix( S0, S1, T / Half ) : mix( S1, S2, (T-Half) / Half ); vec2 D = PixelSize * u_Resolution.zw; vec2 UV = v_TexCoord.xy; // 5-tap Poisson disk coefficients vec2 Disk[5]; Disk[0] = vec2( 0.1134811, 0.6604039) * D + UV; Disk[1] = vec2(-0.4988798, 0.2663419) * D + UV; Disk[2] = vec2(-0.4542479, -0.4338912) * D + UV; Disk[3] = vec2( 0.7253948, -0.1434357) * D + UV; Disk[4] = vec2( 0.09679408, -0.9359848) * D + UV; vec4 C0 = texture( Texture0, UV ); C0 += texture( Texture0, Disk[0] ); C0 += texture( Texture0, Disk[1] ); C0 += texture( Texture0, Disk[2] ); C0 += texture( Texture0, Disk[3] ); C0 += texture( Texture0, Disk[4] ); C0 /= 6.0; vec4 C1 = texture( Texture1, UV ); C1 += texture( Texture1, Disk[0] ); C1 += texture( Texture1, Disk[1] ); C1 += texture( Texture1, Disk[2] ); C1 += texture( Texture1, Disk[3] ); C1 += texture( Texture1, Disk[4] ); C1 /= 6.0; out_FragColor = mix( C0, C1, T ); }
Btw, you can checkout how this transition looks like on GLSL.io.