precision highp float; uniform sampler2D uParticlesA; uniform sampler2D uParticlesB; uniform float uRandomData; uniform float uFactor; varying vec2 fUV; float random(float v) { return fract(sin(dot(vec2(fUV.x * cos(v * uRandomData), fUV.y * sin(v * uRandomData)), vec2(12.9898, 78.233))) * 43758.5453); } void main() { vec4 particleAData = texture2D(uParticlesA, fUV); vec4 particleBData = texture2D(uParticlesB, fUV); particleAData.x += cos(particleAData.z) * (particleAData.w * 0.125) * uFactor; particleAData.y += sin(particleAData.z) * (particleAData.w * 0.125) * uFactor; particleAData.w *= 0.9; // velocity if (particleAData.w < (2.0 / 1024.0)) { particleAData.z += random(1.424); // angle particleAData.w = (2.0 / 256.0); } if (particleBData.x < 0.0) { particleAData.x = (random(2.234) * 2.0) - 1.0; particleAData.y = (random(3.529) * 2.0) - 1.0; } gl_FragColor = particleAData; }