Monthly Archives: June 2014

Rendering UI transitions on mobile: Adreno 330

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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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.