For this week, I expanded upon my week 2 shader by adding noise and distorting it.
I first started by adding noise to the colour of my circles, and I experimented with the effects using different values would give me. I also applied noise to the entire canvas by using st.x, distorting the entire sketch.
#ifdef GL_ES precision mediump float; #endif uniform vec2 u_resolution; uniform vec2 u_mouse; uniform float u_time; vec2 createGrid( in vec2 st, in vec2 grid, out vec2 indices ){ // multiply by the number of cells // [0,1] range => [0,10] (for example) st *= grid; // get the cell indices // for example, in a grid of 10x10: // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 indices = floor(st); // use fract to get the fractional amount of st // 9.5 => 0.5 // shows the xy coordinate in each cell st = fract(st); return st; } float drawCircle (vec2 st, vec2 pos, float size){ float result = distance (st, pos); result=1.-step(size,result); return result; } float random (vec2 st) { return fract(sin(dot(st.xy, vec2(12.9898,78.233)))* 43758.5453123); } vec3 permute(vec3 x) { return mod(((x*34.0)+1.0)*x, 289.0); } float snoise(vec2 v){ const vec4 C = vec4(0.211324865405187, 0.366025403784439, -0.577350269189626, 0.024390243902439); vec2 i = floor(v + dot(v, C.yy) ); vec2 x0 = v - i + dot(i, C.xx); vec2 i1; i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0); vec4 x12 = x0.xyxy + C.xxzz; x12.xy -= i1; i = mod(i, 289.0); vec3 p = permute( permute( i.y + vec3(0.0, i1.y, 1.0 )) + i.x + vec3(0.0, i1.x, 1.0 )); vec3 m = max(0.5 - vec3(dot(x0,x0), dot(x12.xy,x12.xy), dot(x12.zw,x12.zw)), 0.0); m = m*m ; m = m*m ; vec3 x = 2.0 * fract(p * C.www) - 1.0; vec3 h = abs(x) - 0.5; vec3 ox = floor(x + 0.5); vec3 a0 = x - ox; m *= 1.79284291400159 - 0.85373472095314 * ( a0*a0 + h*h ); vec3 g; g.x = a0.x * x0.x + h.x * x0.y; g.yz = a0.yz * x12.xz + h.yz * x12.yw; return 130.0 * dot(m, g); } void main() { vec2 st = gl_FragCoord.xy/u_resolution.xy; st.x *= u_resolution.x/u_resolution.y; st.x += snoise(st*0.4); // good practice to take a copy of the original st // before you change it vec2 st0 = st; vec2 indices; // This divides the result of the sin function, changing the final size of the circle float size = 3.; // This changes the period of the sin function, changing the speed at which the circles animate float speed = 3.; vec3 color; color.r = snoise(st*2. + vec2(0., u_time*.5)) * 0.5+0.5; color.g = snoise(st*2. + vec2(100., u_time*.5)) * 0.5+0.5; color.b = snoise(st*2. + vec2(200., u_time*.5)) * 0.5+0.5; // Create grid for circles st = createGrid( st, vec2(5., 5.), indices); // Set bg colour // Change the colour and sin function of each column if(indices.x == 0.){ float r = drawCircle(st, vec2(0.5), sin(u_time*speed)/size); vec3 circleC; circleC.r = snoise(st*2. + vec2(0., u_time*2.)) * 0.5+0.5; circleC.g = snoise(st*2. + vec2(100., u_time*2.)) * 0.5+0.5; circleC.b = snoise(st*2. + vec2(200., u_time*2.)) * 0.5+0.5; color = mix( color, circleC, r); }else if(indices.x == 1.){ float r = drawCircle(st, vec2(0.5), sin(u_time*speed+1.)/size); vec3 circleC; circleC.r = snoise(st*2. + vec2(0., u_time*2.)) * 0.5+0.5; circleC.g = snoise(st*2. + vec2(100., u_time*2.)) * 0.5+0.5; circleC.b = snoise(st*2. + vec2(200., u_time*2.)) * 0.5+0.5; color = mix( color, circleC, r); } else if(indices.x == 2.){ float r = drawCircle(st, vec2(0.5), sin(u_time*speed+2.)/size); vec3 circleC; circleC.r = snoise(st*2. + vec2(0., u_time*2.)) * 0.5+0.5; circleC.g = snoise(st*2. + vec2(100., u_time*2.)) * 0.5+0.5; circleC.b = snoise(st*2. + vec2(200., u_time*2.)) * 0.5+0.5; color = mix( color, circleC, r); } else if(indices.x == 3.){ float r = drawCircle(st, vec2(0.5), sin(u_time*speed+3.)/size); vec3 circleC; circleC.r = snoise(st*2. + vec2(0., u_time*2.)) * 0.5+0.5; circleC.g = snoise(st*2. + vec2(100., u_time*2.)) * 0.5+0.5; circleC.b = snoise(st*2. + vec2(200., u_time*2.)) * 0.5+0.5; color = mix( color, circleC, r); } else if(indices.x == 4.){ float r = drawCircle(st, vec2(0.5), sin(u_time*speed+4.)/size); vec3 circleC; circleC.r = snoise(st*2. + vec2(0., u_time*2.)) * 0.5+0.5; circleC.g = snoise(st*2. + vec2(100., u_time*2.)) * 0.5+0.5; circleC.b = snoise(st*2. + vec2(200., u_time*2.)) * 0.5+0.5; color = mix( color, circleC, r); } gl_FragColor = vec4(color,1.0); }