|
@@ -2,53 +2,39 @@
|
|
|
|
|
|
// Uniforms
|
|
|
uniform float brightness;
|
|
|
-uniform int firstOctave;
|
|
|
uniform int octaves;
|
|
|
uniform float persistence;
|
|
|
-uniform vec2 timeScale;
|
|
|
+uniform float timeScale;
|
|
|
|
|
|
// Varyings
|
|
|
varying vec2 vUV;
|
|
|
|
|
|
// Functions
|
|
|
-float noise(int x,int y)
|
|
|
-{
|
|
|
- float fx = float(x);
|
|
|
- float fy = float(y);
|
|
|
-
|
|
|
- return 2.0 * fract(sin(dot(vec2(fx, fy), vec2(12.9898, 78.233))) * 43758.5453) - 1.0;
|
|
|
-}
|
|
|
-
|
|
|
-float smoothNoise(int x,int y)
|
|
|
-{
|
|
|
- return noise(x, y) / 4.0 + (noise(x + 1, y) + noise(x - 1,y) +
|
|
|
- noise(x, y + 1) + noise(x, y - 1)) / 8.0 + (noise(x + 1, y + 1) +
|
|
|
- noise(x + 1,y - 1) + noise(x - 1, y + 1) + noise(x - 1,y - 1)) / 16.0;
|
|
|
-}
|
|
|
-
|
|
|
-float cosInterpolation(float x,float y,float n)
|
|
|
+vec2 hash22(vec2 p)
|
|
|
{
|
|
|
- float r = n * 3.1415926;
|
|
|
- float f = (1.0 - cos(r)) * 0.5;
|
|
|
- return x * (1.0 - f) + y * f;
|
|
|
+ p = p * mat2(127.1, 311.7, 269.5, 183.3);
|
|
|
+ p = -1.0 + 2.0 * fract(sin(p) * 43758.5453123);
|
|
|
+ return sin(p * 6.283 + timeScale);
|
|
|
}
|
|
|
|
|
|
-float interpolationNoise(float x, float y)
|
|
|
+float interpolationNoise(vec2 p)
|
|
|
{
|
|
|
- int ix = int(x);
|
|
|
- int iy = int(y);
|
|
|
- float fracx = x - float(int(x));
|
|
|
- float fracy = y - float(int(y));
|
|
|
+ vec2 pi = floor(p);
|
|
|
+ vec2 pf = p-pi;
|
|
|
|
|
|
- float v1 = smoothNoise(ix, iy);
|
|
|
- float v2 = smoothNoise(ix + 1, iy);
|
|
|
- float v3 = smoothNoise(ix, iy + 1);
|
|
|
- float v4 = smoothNoise(ix + 1, iy + 1);
|
|
|
+ vec2 w = pf * pf * (3.-2. * pf);
|
|
|
|
|
|
- float i1 = cosInterpolation(v1, v2, fracx);
|
|
|
- float i2 = cosInterpolation(v3, v4, fracx);
|
|
|
+ float f00 = dot(hash22(pi + vec2(.0,.0)), pf-vec2(.0,.0));
|
|
|
+ float f01 = dot(hash22(pi + vec2(.0,1.)), pf-vec2(.0,1.));
|
|
|
+ float f10 = dot(hash22(pi + vec2(1.0,0.)), pf-vec2(1.0,0.));
|
|
|
+ float f11 = dot(hash22(pi + vec2(1.0,1.)), pf-vec2(1.0,1.));
|
|
|
+
|
|
|
+ float xm1 = mix(f00,f10,w.x);
|
|
|
+ float xm2 = mix(f01,f11,w.x);
|
|
|
|
|
|
- return cosInterpolation(i1, i2, fracy);
|
|
|
+ float ym = mix(xm1,xm2,w.y);
|
|
|
+ return ym;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
float perlinNoise2D(float x,float y)
|
|
@@ -56,11 +42,11 @@ float perlinNoise2D(float x,float y)
|
|
|
float sum = 0.0;
|
|
|
float frequency = 0.0;
|
|
|
float amplitude = 0.0;
|
|
|
- for(int i = firstOctave; i < octaves + firstOctave; i++)
|
|
|
+ for(int i = 0; i < octaves; i++)
|
|
|
{
|
|
|
frequency = pow(2.0, float(i));
|
|
|
amplitude = pow(persistence, float(i));
|
|
|
- sum = sum + interpolationNoise(x * frequency, y * frequency) * amplitude;
|
|
|
+ sum = sum + interpolationNoise(vec2(x * frequency, y * frequency)) * amplitude;
|
|
|
}
|
|
|
|
|
|
return sum;
|
|
@@ -69,8 +55,8 @@ float perlinNoise2D(float x,float y)
|
|
|
// Main
|
|
|
void main(void)
|
|
|
{
|
|
|
- float x = abs(vUV.x + timeScale.x);
|
|
|
- float y = abs(vUV.y + timeScale.y);
|
|
|
+ float x = abs(vUV.x);
|
|
|
+ float y = abs(vUV.y);
|
|
|
|
|
|
float noise = brightness + (1.0 - brightness) * perlinNoise2D(x,y);
|
|
|
|