highp float rand(highp float co) { return fract(sin(co * (91.3458)) * 47453.5453); } void fragment() { highp vec2 uv = UV; highp vec2 texel = 1.0 * SCREEN_PIXEL_SIZE.xy; highp vec4 img = texture(TEXTURE, uv); // modulate offset highp float step_y = texel.y * (rand(uv.x) * 80) * (sin(sin(TIME * 0.5)) * 2.0 + 1.3); // offset without modulation //highp float step_y = texel.y*(rand(uv.x)*100.0); // shake offset and modulate it step_y += rand(uv.x * uv.y * TIME) * 0.025 * sin(TIME); // more noisy spikes step_y = mix(step_y, step_y * rand(uv.x * TIME) * 0.5, sin(TIME)); if (dot(img, vec4(0.299, 0.587, 0.114, 0.0)) > 1.2*(sin(TIME) * 0.325 + 0.50)) { uv.y += step_y; } else { uv.y -= step_y; } COLOR = texture(TEXTURE, uv); }