xxxxxxxxxx
68
precision mediump float;
varying vec2 pos;
const float colourVariance = 0.2;
uniform vec3 colourA;
uniform vec3 colourB;
uniform float seed;
// 2D Random with salt
float random (in vec2 st, in float salt) {
return fract(sin(dot(st, vec2(12.9898, 78.233) + salt + seed)) * 43758.5453);
}
// 2D Noise based on Morgan McGuire @morgan3d
// https://www.shadertoy.com/view/4dS3Wd
float noise (in vec2 st, float scale, float salt) {
st *= scale;
vec2 i = floor(st);
vec2 f = fract(st);
// Four corners in 2D of a tile
float a = random(i, salt);
float b = random(i + vec2(1.0, 0.0), salt);
float c = random(i + vec2(0.0, 1.0), salt);
float d = random(i + vec2(1.0, 1.0), salt);
// Smooth Interpolation
// Cubic Hermine Curve. Same as SmoothStep()
vec2 u = f*f*(3.0-2.0*f);
// u = smoothstep(0.,1.,f);
// Mix 4 coorners percentages
return mix(a, b, u.x) +
(c - a)* u.y * (1.0 - u.x) +
(d - b) * u.x * u.y;
}
void main() {
// Figure out the colour of a circle. <0.5 = colourA, >=0.5 = colourB
float n = noise(pos, 10., 0.) * 0.5;
n += noise(pos, 20., 1.) * 0.25;
n += noise(pos, 40., 2.) * 0.125;
float colourToUse = step(0.5, n);
vec3 colour = mix(colourA, colourB, n);
float varyR = noise(pos, 1., 1.);
float varyG = noise(pos, 2., 2.);
float varyB = noise(pos, 3., 3.);
colour.r += sin(varyR * 6.28) * colourVariance;
colour.g += sin(varyG * 6.28) * colourVariance;
colour.b += sin(varyB * 6.28) * colourVariance;
colour.r += sin(random(pos, 0.0)) * colourVariance;
colour.g += sin(random(pos, 1.0)) * colourVariance;
colour.b += sin(random(pos, 2.0)) * colourVariance;
gl_FragColor = vec4(colour, 1.0);
}