[READ-ONLY] Mirror of https://github.com/flo-bit/flo-bit.github.io. my personal website, w/ astro, svelte, tailwind, typescript, threlte
flo-bit.dev/
portfolio
portfolio-website
svelte
sveltekit
tailwind
threejs
threlte
typescript
3.8 kB
121 lines
1export const noise = /* GLSL */ `
2// Description : Array and textureless GLSL 2D/3D/4D simplex
3// noise functions.
4// Author : Ian McEwan, Ashima Arts.
5// Maintainer : stegu
6// Lastmod : 20110822 (ijm)
7// License : Copyright (C) 2011 Ashima Arts. All rights reserved.
8// Distributed under the MIT License. See LICENSE file.
9// https://github.com/ashima/webgl-noise
10// https://github.com/stegu/webgl-noise
11//
12
13vec4 mod289(vec4 x) {
14 return x - floor(x * (1.0 / 289.0)) * 289.0;
15}
16
17float mod289(float x) {
18 return x - floor(x * (1.0 / 289.0)) * 289.0;
19}
20
21vec4 permute(vec4 x) {
22 return mod289(((x * 34.0) + 10.0) * x);
23}
24
25float permute(float x) {
26 return mod289(((x * 34.0) + 10.0) * x);
27}
28
29vec4 taylorInvSqrt(vec4 r) {
30 return 1.79284291400159 - 0.85373472095314 * r;
31}
32
33float taylorInvSqrt(float r) {
34 return 1.79284291400159 - 0.85373472095314 * r;
35}
36
37vec4 grad4(float j, vec4 ip) {
38 const vec4 ones = vec4(1.0, 1.0, 1.0, -1.0);
39 vec4 p, s;
40
41 p.xyz = floor(fract(vec3(j) * ip.xyz) * 7.0) * ip.z - 1.0;
42 p.w = 1.5 - dot(abs(p.xyz), ones.xyz);
43 s = vec4(lessThan(p, vec4(0.0)));
44 p.xyz = p.xyz + (s.xyz * 2.0 - 1.0) * s.www;
45
46 return p;
47}
48
49 // (sqrt(5) - 1)/4 = F4, used once below
50 #define F4 0.309016994374947451
51
52float snoise(vec4 v) {
53 const vec4 C = vec4(0.138196601125011, // (5 - sqrt(5))/20 G4
54 0.276393202250021, // 2 * G4
55 0.414589803375032, // 3 * G4
56 -0.447213595499958); // -1 + 4 * G4
57
58 // First corner
59 vec4 i = floor(v + dot(v, vec4(F4)));
60 vec4 x0 = v - i + dot(i, C.xxxx);
61
62 // Other corners
63
64 // Rank sorting originally contributed by Bill Licea-Kane, AMD (formerly ATI)
65 vec4 i0;
66 vec3 isX = step(x0.yzw, x0.xxx);
67 vec3 isYZ = step(x0.zww, x0.yyz);
68 // i0.x = dot( isX, vec3( 1.0 ) );
69 i0.x = isX.x + isX.y + isX.z;
70 i0.yzw = 1.0 - isX;
71 // i0.y += dot( isYZ.xy, vec2( 1.0 ) );
72 i0.y += isYZ.x + isYZ.y;
73 i0.zw += 1.0 - isYZ.xy;
74 i0.z += isYZ.z;
75 i0.w += 1.0 - isYZ.z;
76
77 // i0 now contains the unique values 0,1,2,3 in each channel
78 vec4 i3 = clamp(i0, 0.0, 1.0);
79 vec4 i2 = clamp(i0 - 1.0, 0.0, 1.0);
80 vec4 i1 = clamp(i0 - 2.0, 0.0, 1.0);
81
82 // x0 = x0 - 0.0 + 0.0 * C.xxxx
83 // x1 = x0 - i1 + 1.0 * C.xxxx
84 // x2 = x0 - i2 + 2.0 * C.xxxx
85 // x3 = x0 - i3 + 3.0 * C.xxxx
86 // x4 = x0 - 1.0 + 4.0 * C.xxxx
87 vec4 x1 = x0 - i1 + C.xxxx;
88 vec4 x2 = x0 - i2 + C.yyyy;
89 vec4 x3 = x0 - i3 + C.zzzz;
90 vec4 x4 = x0 + C.wwww;
91
92 // Permutations
93 i = mod289(i);
94 float j0 = permute(permute(permute(permute(i.w) + i.z) + i.y) + i.x);
95 vec4 j1 = permute(permute(permute(permute(i.w + vec4(i1.w, i2.w, i3.w, 1.0)) + i.z + vec4(i1.z, i2.z, i3.z, 1.0)) + i.y + vec4(i1.y, i2.y, i3.y, 1.0)) + i.x + vec4(i1.x, i2.x, i3.x, 1.0));
96
97 // Gradients: 7x7x6 points over a cube, mapped onto a 4-cross polytope
98 // 7*7*6 = 294, which is close to the ring size 17*17 = 289.
99 vec4 ip = vec4(1.0 / 294.0, 1.0 / 49.0, 1.0 / 7.0, 0.0);
100
101 vec4 p0 = grad4(j0, ip);
102 vec4 p1 = grad4(j1.x, ip);
103 vec4 p2 = grad4(j1.y, ip);
104 vec4 p3 = grad4(j1.z, ip);
105 vec4 p4 = grad4(j1.w, ip);
106
107 // Normalise gradients
108 vec4 norm = taylorInvSqrt(vec4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)));
109 p0 *= norm.x;
110 p1 *= norm.y;
111 p2 *= norm.z;
112 p3 *= norm.w;
113 p4 *= taylorInvSqrt(dot(p4, p4));
114
115 // Mix contributions from the five corners
116 vec3 m0 = max(0.6 - vec3(dot(x0, x0), dot(x1, x1), dot(x2, x2)), 0.0);
117 vec2 m1 = max(0.6 - vec2(dot(x3, x3), dot(x4, x4)), 0.0);
118 m0 = m0 * m0;
119 m1 = m1 * m1;
120 return 49.0 * (dot(m0 * m0, vec3(dot(p0, x0), dot(p1, x1), dot(p2, x2))) + dot(m1 * m1, vec2(dot(p3, x3), dot(p4, x4))));
121}`;