UNPKG

kampos

Version:

Tiny and fast effects compositor on WebGL

154 lines (123 loc) 4.67 kB
/*! * Cellular noise ("Worley noise") in 3D in GLSL. * Author: Stefan Gustavson (stefan.gustavson@liu.se) * Version: Stefan Gustavson 2011-04-19 * * Many thanks to Ian McEwan of Ashima Arts for the * ideas for permutation and gradient selection. * * Copyright (c) 2011 Stefan Gustavson. All rights reserved. * Distributed under the MIT license. See LICENSE file. * https://github.com/ashima/webgl-noise */ /** * Cellular noise ("Worley noise") in 3D in GLSL. Exposes a `noise(vec3 P)` function for use inside fragment shaders. */ export default ` vec3 mod289(vec3 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; } // Modulo 7 without a division vec3 mod7(vec3 x) { return x - floor(x * (1.0 / 7.0)) * 7.0; } // Permutation polynomial: (34x^2 + x) mod 289 vec3 permute(vec3 x) { return mod289((34.0 * x + 1.0) * x); } float noise(vec3 P) { #define K 0.142857142857 // 1/7 #define Ko 0.428571428571 // 1/2-K/2 #define K2 0.020408163265306 // 1/(7*7) #define Kz 0.166666666667 // 1/6 #define Kzo 0.416666666667 // 1/2-1/6*2 #define jitter 1.0 // smaller jitter gives more regular pattern vec3 Pi = mod289(floor(P)); vec3 Pf = fract(P) - 0.5; vec3 Pfx = Pf.x + vec3(1.0, 0.0, -1.0); vec3 Pfy = Pf.y + vec3(1.0, 0.0, -1.0); vec3 Pfz = Pf.z + vec3(1.0, 0.0, -1.0); vec3 p = permute(Pi.x + vec3(-1.0, 0.0, 1.0)); vec3 p1 = permute(p + Pi.y - 1.0); vec3 p2 = permute(p + Pi.y); vec3 p3 = permute(p + Pi.y + 1.0); vec3 p11 = permute(p1 + Pi.z - 1.0); vec3 p12 = permute(p1 + Pi.z); vec3 p13 = permute(p1 + Pi.z + 1.0); vec3 p21 = permute(p2 + Pi.z - 1.0); vec3 p22 = permute(p2 + Pi.z); vec3 p23 = permute(p2 + Pi.z + 1.0); vec3 p31 = permute(p3 + Pi.z - 1.0); vec3 p32 = permute(p3 + Pi.z); vec3 p33 = permute(p3 + Pi.z + 1.0); vec3 ox11 = fract(p11*K) - Ko; vec3 oy11 = mod7(floor(p11*K))*K - Ko; vec3 oz11 = floor(p11*K2)*Kz - Kzo; // p11 < 289 guaranteed vec3 ox12 = fract(p12*K) - Ko; vec3 oy12 = mod7(floor(p12*K))*K - Ko; vec3 oz12 = floor(p12*K2)*Kz - Kzo; vec3 ox13 = fract(p13*K) - Ko; vec3 oy13 = mod7(floor(p13*K))*K - Ko; vec3 oz13 = floor(p13*K2)*Kz - Kzo; vec3 ox21 = fract(p21*K) - Ko; vec3 oy21 = mod7(floor(p21*K))*K - Ko; vec3 oz21 = floor(p21*K2)*Kz - Kzo; vec3 ox22 = fract(p22*K) - Ko; vec3 oy22 = mod7(floor(p22*K))*K - Ko; vec3 oz22 = floor(p22*K2)*Kz - Kzo; vec3 ox23 = fract(p23*K) - Ko; vec3 oy23 = mod7(floor(p23*K))*K - Ko; vec3 oz23 = floor(p23*K2)*Kz - Kzo; vec3 ox31 = fract(p31*K) - Ko; vec3 oy31 = mod7(floor(p31*K))*K - Ko; vec3 oz31 = floor(p31*K2)*Kz - Kzo; vec3 ox32 = fract(p32*K) - Ko; vec3 oy32 = mod7(floor(p32*K))*K - Ko; vec3 oz32 = floor(p32*K2)*Kz - Kzo; vec3 ox33 = fract(p33*K) - Ko; vec3 oy33 = mod7(floor(p33*K))*K - Ko; vec3 oz33 = floor(p33*K2)*Kz - Kzo; vec3 dx11 = Pfx + jitter*ox11; vec3 dy11 = Pfy.x + jitter*oy11; vec3 dz11 = Pfz.x + jitter*oz11; vec3 dx12 = Pfx + jitter*ox12; vec3 dy12 = Pfy.x + jitter*oy12; vec3 dz12 = Pfz.y + jitter*oz12; vec3 dx13 = Pfx + jitter*ox13; vec3 dy13 = Pfy.x + jitter*oy13; vec3 dz13 = Pfz.z + jitter*oz13; vec3 dx21 = Pfx + jitter*ox21; vec3 dy21 = Pfy.y + jitter*oy21; vec3 dz21 = Pfz.x + jitter*oz21; vec3 dx22 = Pfx + jitter*ox22; vec3 dy22 = Pfy.y + jitter*oy22; vec3 dz22 = Pfz.y + jitter*oz22; vec3 dx23 = Pfx + jitter*ox23; vec3 dy23 = Pfy.y + jitter*oy23; vec3 dz23 = Pfz.z + jitter*oz23; vec3 dx31 = Pfx + jitter*ox31; vec3 dy31 = Pfy.z + jitter*oy31; vec3 dz31 = Pfz.x + jitter*oz31; vec3 dx32 = Pfx + jitter*ox32; vec3 dy32 = Pfy.z + jitter*oy32; vec3 dz32 = Pfz.y + jitter*oz32; vec3 dx33 = Pfx + jitter*ox33; vec3 dy33 = Pfy.z + jitter*oy33; vec3 dz33 = Pfz.z + jitter*oz33; vec3 d11 = dx11 * dx11 + dy11 * dy11 + dz11 * dz11; vec3 d12 = dx12 * dx12 + dy12 * dy12 + dz12 * dz12; vec3 d13 = dx13 * dx13 + dy13 * dy13 + dz13 * dz13; vec3 d21 = dx21 * dx21 + dy21 * dy21 + dz21 * dz21; vec3 d22 = dx22 * dx22 + dy22 * dy22 + dz22 * dz22; vec3 d23 = dx23 * dx23 + dy23 * dy23 + dz23 * dz23; vec3 d31 = dx31 * dx31 + dy31 * dy31 + dz31 * dz31; vec3 d32 = dx32 * dx32 + dy32 * dy32 + dz32 * dz32; vec3 d33 = dx33 * dx33 + dy33 * dy33 + dz33 * dz33; vec3 d1 = min(min(d11,d12), d13); vec3 d2 = min(min(d21,d22), d23); vec3 d3 = min(min(d31,d32), d33); vec3 d = min(min(d1,d2), d3); d.x = min(min(d.x,d.y),d.z); return sqrt(d.x); } `;