#define iChannel0 inputImageTexture
#define iChannel1 inputImageTexture2
#define texture(a,b) texture2D(a,fract(b))
#define fragColor gl_FragColor
precision highp float;

varying highp vec2 textureCoordinate;
varying highp vec2 textureCoordinate2;

uniform sampler2D inputImageTexture;
uniform sampler2D inputImageTexture2;

uniform highp float iTime;

uniform highp vec2 iResolution;

void main() {
    highp vec2 fragCoord = textureCoordinate * iResolution;
    highp vec2 uv = textureCoordinate;

    //Noise position
    vec2 xy = uv;
    xy.x += iTime * 5.;

    //Diagonal displacement
    uv.x = uv.x - fract(uv.x + iTime * 0.5 - uv.x);
    uv.y = uv.y - fract(uv.y + iTime * 0.5 - uv.y);

    //Horizontal glitches
    int displ = int(floor(uv.y * float(iResolution.y * 2. )));
    uv.x += (uv.x * mod(float(displ), floor(sin(iTime*10.) * 10.))) * 0.003;
    uv.x -= (uv.x * mod(float(displ), floor(tan(iTime*10.) * 10.))) * 0.0005;

    vec4 texColor = texture(iChannel0,uv);
    vec4 noise = texture(iChannel1, xy);
    noise *= 0.2;

    fragColor = texColor+noise;

    //Colour distortion
    int index1 = int(floor(uv.y * tan(iTime) * 10.) * cos(iTime));
    int index2 = int(floor(uv.y * 50.) * cos(iTime) * 4.);

    fragColor.r *= mod(float(index1), 2.) * 0.2;
    fragColor.b += mod(float(index2), 2.) * 0.2;
}
