@@ -80,10 +80,62 @@ float snoise(vec2 v) {
80
80
}
81
81
82
82
83
+ // https://thebookofshaders.com/edit.php#12/2d-cnoise.frag
84
+
85
+ // Permutation polynomial: (34x^2 + x) mod 289
86
+ // vec3 permute(vec3 x) {
87
+ // return mod((34.0 * x + 1.0) * x, 289.0);
88
+ // }
89
+
90
+ // Cellular noise, returning F1 and F2 in a vec2.
91
+ // Standard 3x3 search window for good F1 and F2 values
92
+ vec2 cellular (vec2 P) {
93
+ #define K 0.142857142857 // 1/7
94
+ #define Ko 0.428571428571 // 3/7
95
+ #define jitter 1.0 // Less gives more regular pattern
96
+ vec2 Pi = mod (floor (P), 289.0 );
97
+ vec2 Pf = fract (P);
98
+ vec3 oi = vec3 (-1.0 , 0.0 , 1.0 );
99
+ vec3 of = vec3 (-0.5 , 0.5 , 1.5 );
100
+ vec3 px = permute (Pi.x + oi);
101
+ vec3 p = permute (px.x + Pi.y + oi); // p11, p12, p13
102
+ vec3 ox = fract (p*K) - Ko;
103
+ vec3 oy = mod (floor (p*K),7.0 )*K - Ko;
104
+ vec3 dx = Pf.x + 0.5 + jitter*ox;
105
+ vec3 dy = Pf.y - of + jitter*oy;
106
+ vec3 d1 = dx * dx + dy * dy; // d11, d12 and d13, squared
107
+ p = permute (px.y + Pi.y + oi); // p21, p22, p23
108
+ ox = fract (p*K) - Ko;
109
+ oy = mod (floor (p*K),7.0 )*K - Ko;
110
+ dx = Pf.x - 0.5 + jitter*ox;
111
+ dy = Pf.y - of + jitter*oy;
112
+ vec3 d2 = dx * dx + dy * dy; // d21, d22 and d23, squared
113
+ p = permute (px.z + Pi.y + oi); // p31, p32, p33
114
+ ox = fract (p*K) - Ko;
115
+ oy = mod (floor (p*K),7.0 )*K - Ko;
116
+ dx = Pf.x - 1.5 + jitter*ox;
117
+ dy = Pf.y - of + jitter*oy;
118
+ vec3 d3 = dx * dx + dy * dy; // d31, d32 and d33, squared
119
+ // Sort out the two smallest distances (F1, F2)
120
+ vec3 d1a = min (d1, d2);
121
+ d2 = max (d1, d2); // Swap to keep candidates for F2
122
+ d2 = min (d2, d3); // neither F1 nor F2 are now in d3
123
+ d1 = min (d1a, d2); // F1 is now in d1
124
+ d2 = max (d1a, d2); // Swap to keep candidates for F2
125
+ d1.xy = (d1.x < d1.y) ? d1.xy : d1.yx; // Swap if smaller
126
+ d1.xz = (d1.x < d1.z) ? d1.xz : d1.zx; // F1 is in d1.x
127
+ d1.yz = min (d1.yz, d2.yz); // F2 is now not in d2.yz
128
+ d1.y = min (d1.y, d1.z); // nor in d1.z
129
+ d1.y = min (d1.y, d2.x); // F2 is in d1.y, we're done.
130
+ return sqrt (d1.xy);
131
+ }
132
+
133
+
83
134
// https://thebookofshaders.com/edit.php#12/3d-cnoise.frag
84
- //vec3 permute(vec3 x) {
85
- // return mod((34.0 * x + 1.0) * x, 289.0);
86
- //}
135
+
136
+ // vec3 permute(vec3 x) {
137
+ // return mod((34.0 * x + 1.0) * x, 289.0);
138
+ // }
87
139
88
140
// Cellular noise, returning F1 and F2 in a vec2.
89
141
// 3x3x3 search region for good F2 everywhere, but a lot
0 commit comments