|
35 | 35 | sampler2D _MainTex;
|
36 | 36 | float4 _MainTex_ST;
|
37 | 37 |
|
38 |
| - float3 mod_emu(float3 x, float y) |
39 |
| - { |
40 |
| - return x - y * floor(x / y); |
| 38 | + // porting from GLSL |
| 39 | + #define vec2 float2 |
| 40 | + #define vec3 float3 |
| 41 | + #define vec4 float4 |
| 42 | + #define mod(x, y) (x - y * floor(x / y)) |
| 43 | + #define fract frac |
| 44 | + |
| 45 | + // https://thebookofshaders.com/edit.php#12/3d-cnoise.frag |
| 46 | + vec3 permute(vec3 x) { |
| 47 | + return mod((34.0 * x + 1.0) * x, 289.0); |
41 | 48 | }
|
42 | 49 |
|
43 |
| - float3 f_permute(in float3 _x) |
44 |
| - { |
45 |
| - return mod_emu((((34.0 * _x) + 1.0) * _x), 289.0); |
46 |
| - } |
| 50 | + // Cellular noise, returning F1 and F2 in a vec2. |
| 51 | + // 3x3x3 search region for good F2 everywhere, but a lot |
| 52 | + // slower than the 2x2x2 version. |
| 53 | + // The code below is a bit scary even to its author, |
| 54 | + // but it has at least half decent performance on a |
| 55 | + // modern GPU. In any case, it beats any software |
| 56 | + // implementation of Worley noise hands down. |
| 57 | + |
| 58 | + vec2 cellular(vec3 P) { |
| 59 | + #define K 0.142857142857 // 1/7 |
| 60 | + #define Ko 0.428571428571 // 1/2-K/2 |
| 61 | + #define K2 0.020408163265306 // 1/(7*7) |
| 62 | + #define Kz 0.166666666667 // 1/6 |
| 63 | + #define Kzo 0.416666666667 // 1/2-1/6*2 |
| 64 | + #define jitter 1.0 // smaller jitter gives more regular pattern |
| 65 | + |
| 66 | + vec3 Pi = mod(floor(P), 289.0); |
| 67 | + vec3 Pf = fract(P) - 0.5; |
| 68 | + |
| 69 | + vec3 Pfx = Pf.x + vec3(1.0, 0.0, -1.0); |
| 70 | + vec3 Pfy = Pf.y + vec3(1.0, 0.0, -1.0); |
| 71 | + vec3 Pfz = Pf.z + vec3(1.0, 0.0, -1.0); |
| 72 | + |
| 73 | + vec3 p = permute(Pi.x + vec3(-1.0, 0.0, 1.0)); |
| 74 | + vec3 p1 = permute(p + Pi.y - 1.0); |
| 75 | + vec3 p2 = permute(p + Pi.y); |
| 76 | + vec3 p3 = permute(p + Pi.y + 1.0); |
| 77 | + |
| 78 | + vec3 p11 = permute(p1 + Pi.z - 1.0); |
| 79 | + vec3 p12 = permute(p1 + Pi.z); |
| 80 | + vec3 p13 = permute(p1 + Pi.z + 1.0); |
| 81 | + |
| 82 | + vec3 p21 = permute(p2 + Pi.z - 1.0); |
| 83 | + vec3 p22 = permute(p2 + Pi.z); |
| 84 | + vec3 p23 = permute(p2 + Pi.z + 1.0); |
| 85 | + |
| 86 | + vec3 p31 = permute(p3 + Pi.z - 1.0); |
| 87 | + vec3 p32 = permute(p3 + Pi.z); |
| 88 | + vec3 p33 = permute(p3 + Pi.z + 1.0); |
| 89 | + |
| 90 | + vec3 ox11 = fract(p11*K) - Ko; |
| 91 | + vec3 oy11 = mod(floor(p11*K), 7.0)*K - Ko; |
| 92 | + vec3 oz11 = floor(p11*K2)*Kz - Kzo; // p11 < 289 guaranteed |
| 93 | + |
| 94 | + vec3 ox12 = fract(p12*K) - Ko; |
| 95 | + vec3 oy12 = mod(floor(p12*K), 7.0)*K - Ko; |
| 96 | + vec3 oz12 = floor(p12*K2)*Kz - Kzo; |
| 97 | + |
| 98 | + vec3 ox13 = fract(p13*K) - Ko; |
| 99 | + vec3 oy13 = mod(floor(p13*K), 7.0)*K - Ko; |
| 100 | + vec3 oz13 = floor(p13*K2)*Kz - Kzo; |
| 101 | + |
| 102 | + vec3 ox21 = fract(p21*K) - Ko; |
| 103 | + vec3 oy21 = mod(floor(p21*K), 7.0)*K - Ko; |
| 104 | + vec3 oz21 = floor(p21*K2)*Kz - Kzo; |
| 105 | + |
| 106 | + vec3 ox22 = fract(p22*K) - Ko; |
| 107 | + vec3 oy22 = mod(floor(p22*K), 7.0)*K - Ko; |
| 108 | + vec3 oz22 = floor(p22*K2)*Kz - Kzo; |
| 109 | + |
| 110 | + vec3 ox23 = fract(p23*K) - Ko; |
| 111 | + vec3 oy23 = mod(floor(p23*K), 7.0)*K - Ko; |
| 112 | + vec3 oz23 = floor(p23*K2)*Kz - Kzo; |
| 113 | + |
| 114 | + vec3 ox31 = fract(p31*K) - Ko; |
| 115 | + vec3 oy31 = mod(floor(p31*K), 7.0)*K - Ko; |
| 116 | + vec3 oz31 = floor(p31*K2)*Kz - Kzo; |
| 117 | + |
| 118 | + vec3 ox32 = fract(p32*K) - Ko; |
| 119 | + vec3 oy32 = mod(floor(p32*K), 7.0)*K - Ko; |
| 120 | + vec3 oz32 = floor(p32*K2)*Kz - Kzo; |
| 121 | + |
| 122 | + vec3 ox33 = fract(p33*K) - Ko; |
| 123 | + vec3 oy33 = mod(floor(p33*K), 7.0)*K - Ko; |
| 124 | + vec3 oz33 = floor(p33*K2)*Kz - Kzo; |
| 125 | + |
| 126 | + vec3 dx11 = Pfx + jitter*ox11; |
| 127 | + vec3 dy11 = Pfy.x + jitter*oy11; |
| 128 | + vec3 dz11 = Pfz.x + jitter*oz11; |
| 129 | + |
| 130 | + vec3 dx12 = Pfx + jitter*ox12; |
| 131 | + vec3 dy12 = Pfy.x + jitter*oy12; |
| 132 | + vec3 dz12 = Pfz.y + jitter*oz12; |
| 133 | + |
| 134 | + vec3 dx13 = Pfx + jitter*ox13; |
| 135 | + vec3 dy13 = Pfy.x + jitter*oy13; |
| 136 | + vec3 dz13 = Pfz.z + jitter*oz13; |
| 137 | + |
| 138 | + vec3 dx21 = Pfx + jitter*ox21; |
| 139 | + vec3 dy21 = Pfy.y + jitter*oy21; |
| 140 | + vec3 dz21 = Pfz.x + jitter*oz21; |
| 141 | + |
| 142 | + vec3 dx22 = Pfx + jitter*ox22; |
| 143 | + vec3 dy22 = Pfy.y + jitter*oy22; |
| 144 | + vec3 dz22 = Pfz.y + jitter*oz22; |
| 145 | + |
| 146 | + vec3 dx23 = Pfx + jitter*ox23; |
| 147 | + vec3 dy23 = Pfy.y + jitter*oy23; |
| 148 | + vec3 dz23 = Pfz.z + jitter*oz23; |
| 149 | + |
| 150 | + vec3 dx31 = Pfx + jitter*ox31; |
| 151 | + vec3 dy31 = Pfy.z + jitter*oy31; |
| 152 | + vec3 dz31 = Pfz.x + jitter*oz31; |
| 153 | + |
| 154 | + vec3 dx32 = Pfx + jitter*ox32; |
| 155 | + vec3 dy32 = Pfy.z + jitter*oy32; |
| 156 | + vec3 dz32 = Pfz.y + jitter*oz32; |
| 157 | + |
| 158 | + vec3 dx33 = Pfx + jitter*ox33; |
| 159 | + vec3 dy33 = Pfy.z + jitter*oy33; |
| 160 | + vec3 dz33 = Pfz.z + jitter*oz33; |
| 161 | + |
| 162 | + vec3 d11 = dx11 * dx11 + dy11 * dy11 + dz11 * dz11; |
| 163 | + vec3 d12 = dx12 * dx12 + dy12 * dy12 + dz12 * dz12; |
| 164 | + vec3 d13 = dx13 * dx13 + dy13 * dy13 + dz13 * dz13; |
| 165 | + vec3 d21 = dx21 * dx21 + dy21 * dy21 + dz21 * dz21; |
| 166 | + vec3 d22 = dx22 * dx22 + dy22 * dy22 + dz22 * dz22; |
| 167 | + vec3 d23 = dx23 * dx23 + dy23 * dy23 + dz23 * dz23; |
| 168 | + vec3 d31 = dx31 * dx31 + dy31 * dy31 + dz31 * dz31; |
| 169 | + vec3 d32 = dx32 * dx32 + dy32 * dy32 + dz32 * dz32; |
| 170 | + vec3 d33 = dx33 * dx33 + dy33 * dy33 + dz33 * dz33; |
47 | 171 |
|
48 |
| - float2 f_cellular(in float3 _P) |
49 |
| - { |
50 |
| - float3 _Pi = mod_emu(floor(_P), 289.0); |
51 |
| - float3 _Pf = (frac(_P) - 0.5); |
52 |
| - float3 _Pfx = (_Pf.x + float3(1.0, 0.0, -1.0)); |
53 |
| - float3 _Pfy = (_Pf.y + float3(1.0, 0.0, -1.0)); |
54 |
| - float3 _Pfz = (_Pf.z + float3(1.0, 0.0, -1.0)); |
55 |
| - float3 _p = f_permute((_Pi.x + float3(-1.0, 0.0, 1.0))); |
56 |
| - float3 _p1 = f_permute(((_p + _Pi.y) - 1.0)); |
57 |
| - float3 _p2 = f_permute((_p + _Pi.y)); |
58 |
| - float3 _p3 = f_permute(((_p + _Pi.y) + 1.0)); |
59 |
| - float3 _p11 = f_permute(((_p1 + _Pi.z) - 1.0)); |
60 |
| - float3 _p12 = f_permute((_p1 + _Pi.z)); |
61 |
| - float3 _p13 = f_permute(((_p1 + _Pi.z) + 1.0)); |
62 |
| - float3 _p21 = f_permute(((_p2 + _Pi.z) - 1.0)); |
63 |
| - float3 _p22 = f_permute((_p2 + _Pi.z)); |
64 |
| - float3 _p23 = f_permute(((_p2 + _Pi.z) + 1.0)); |
65 |
| - float3 _p31 = f_permute(((_p3 + _Pi.z) - 1.0)); |
66 |
| - float3 _p32 = f_permute((_p3 + _Pi.z)); |
67 |
| - float3 _p33 = f_permute(((_p3 + _Pi.z) + 1.0)); |
68 |
| - float3 _ox11 = (frac((_p11 * 0.14285715)) - 0.42857143); |
69 |
| - float3 _oy11 = ((mod_emu(floor((_p11 * 0.14285715)), 7.0) * 0.14285715) - 0.42857143); |
70 |
| - float3 _oz11 = ((floor((_p11 * 0.020408163)) * 0.16666667) - 0.41666666); |
71 |
| - float3 _ox12 = (frac((_p12 * 0.14285715)) - 0.42857143); |
72 |
| - float3 _oy12 = ((mod_emu(floor((_p12 * 0.14285715)), 7.0) * 0.14285715) - 0.42857143); |
73 |
| - float3 _oz12 = ((floor((_p12 * 0.020408163)) * 0.16666667) - 0.41666666); |
74 |
| - float3 _ox13 = (frac((_p13 * 0.14285715)) - 0.42857143); |
75 |
| - float3 _oy13 = ((mod_emu(floor((_p13 * 0.14285715)), 7.0) * 0.14285715) - 0.42857143); |
76 |
| - float3 _oz13 = ((floor((_p13 * 0.020408163)) * 0.16666667) - 0.41666666); |
77 |
| - float3 _ox21 = (frac((_p21 * 0.14285715)) - 0.42857143); |
78 |
| - float3 _oy21 = ((mod_emu(floor((_p21 * 0.14285715)), 7.0) * 0.14285715) - 0.42857143); |
79 |
| - float3 _oz21 = ((floor((_p21 * 0.020408163)) * 0.16666667) - 0.41666666); |
80 |
| - float3 _ox22 = (frac((_p22 * 0.14285715)) - 0.42857143); |
81 |
| - float3 _oy22 = ((mod_emu(floor((_p22 * 0.14285715)), 7.0) * 0.14285715) - 0.42857143); |
82 |
| - float3 _oz22 = ((floor((_p22 * 0.020408163)) * 0.16666667) - 0.41666666); |
83 |
| - float3 _ox23 = (frac((_p23 * 0.14285715)) - 0.42857143); |
84 |
| - float3 _oy23 = ((mod_emu(floor((_p23 * 0.14285715)), 7.0) * 0.14285715) - 0.42857143); |
85 |
| - float3 _oz23 = ((floor((_p23 * 0.020408163)) * 0.16666667) - 0.41666666); |
86 |
| - float3 _ox31 = (frac((_p31 * 0.14285715)) - 0.42857143); |
87 |
| - float3 _oy31 = ((mod_emu(floor((_p31 * 0.14285715)), 7.0) * 0.14285715) - 0.42857143); |
88 |
| - float3 _oz31 = ((floor((_p31 * 0.020408163)) * 0.16666667) - 0.41666666); |
89 |
| - float3 _ox32 = (frac((_p32 * 0.14285715)) - 0.42857143); |
90 |
| - float3 _oy32 = ((mod_emu(floor((_p32 * 0.14285715)), 7.0) * 0.14285715) - 0.42857143); |
91 |
| - float3 _oz32 = ((floor((_p32 * 0.020408163)) * 0.16666667) - 0.41666666); |
92 |
| - float3 _ox33 = (frac((_p33 * 0.14285715)) - 0.42857143); |
93 |
| - float3 _oy33 = ((mod_emu(floor((_p33 * 0.14285715)), 7.0) * 0.14285715) - 0.42857143); |
94 |
| - float3 _oz33 = ((floor((_p33 * 0.020408163)) * 0.16666667) - 0.41666666); |
95 |
| - float3 _dx11 = (_Pfx + (1.0 * _ox11)); |
96 |
| - float3 _dy11 = (_Pfy.x + (1.0 * _oy11)); |
97 |
| - float3 _dz11 = (_Pfz.x + (1.0 * _oz11)); |
98 |
| - float3 _dx12 = (_Pfx + (1.0 * _ox12)); |
99 |
| - float3 _dy12 = (_Pfy.x + (1.0 * _oy12)); |
100 |
| - float3 _dz12 = (_Pfz.y + (1.0 * _oz12)); |
101 |
| - float3 _dx13 = (_Pfx + (1.0 * _ox13)); |
102 |
| - float3 _dy13 = (_Pfy.x + (1.0 * _oy13)); |
103 |
| - float3 _dz13 = (_Pfz.z + (1.0 * _oz13)); |
104 |
| - float3 _dx21 = (_Pfx + (1.0 * _ox21)); |
105 |
| - float3 _dy21 = (_Pfy.y + (1.0 * _oy21)); |
106 |
| - float3 _dz21 = (_Pfz.x + (1.0 * _oz21)); |
107 |
| - float3 _dx22 = (_Pfx + (1.0 * _ox22)); |
108 |
| - float3 _dy22 = (_Pfy.y + (1.0 * _oy22)); |
109 |
| - float3 _dz22 = (_Pfz.y + (1.0 * _oz22)); |
110 |
| - float3 _dx23 = (_Pfx + (1.0 * _ox23)); |
111 |
| - float3 _dy23 = (_Pfy.y + (1.0 * _oy23)); |
112 |
| - float3 _dz23 = (_Pfz.z + (1.0 * _oz23)); |
113 |
| - float3 _dx31 = (_Pfx + (1.0 * _ox31)); |
114 |
| - float3 _dy31 = (_Pfy.z + (1.0 * _oy31)); |
115 |
| - float3 _dz31 = (_Pfz.x + (1.0 * _oz31)); |
116 |
| - float3 _dx32 = (_Pfx + (1.0 * _ox32)); |
117 |
| - float3 _dy32 = (_Pfy.z + (1.0 * _oy32)); |
118 |
| - float3 _dz32 = (_Pfz.y + (1.0 * _oz32)); |
119 |
| - float3 _dx33 = (_Pfx + (1.0 * _ox33)); |
120 |
| - float3 _dy33 = (_Pfy.z + (1.0 * _oy33)); |
121 |
| - float3 _dz33 = (_Pfz.z + (1.0 * _oz33)); |
122 |
| - float3 _d11 = (((_dx11 * _dx11) + (_dy11 * _dy11)) + (_dz11 * _dz11)); |
123 |
| - float3 _d12 = (((_dx12 * _dx12) + (_dy12 * _dy12)) + (_dz12 * _dz12)); |
124 |
| - float3 _d13 = (((_dx13 * _dx13) + (_dy13 * _dy13)) + (_dz13 * _dz13)); |
125 |
| - float3 _d21 = (((_dx21 * _dx21) + (_dy21 * _dy21)) + (_dz21 * _dz21)); |
126 |
| - float3 _d22 = (((_dx22 * _dx22) + (_dy22 * _dy22)) + (_dz22 * _dz22)); |
127 |
| - float3 _d23 = (((_dx23 * _dx23) + (_dy23 * _dy23)) + (_dz23 * _dz23)); |
128 |
| - float3 _d31 = (((_dx31 * _dx31) + (_dy31 * _dy31)) + (_dz31 * _dz31)); |
129 |
| - float3 _d32 = (((_dx32 * _dx32) + (_dy32 * _dy32)) + (_dz32 * _dz32)); |
130 |
| - float3 _d33 = (((_dx33 * _dx33) + (_dy33 * _dy33)) + (_dz33 * _dz33)); |
131 |
| - float3 _d1a = min(_d11, _d12); |
132 |
| - (_d12 = max(_d11, _d12)); |
133 |
| - (_d11 = min(_d1a, _d13)); |
134 |
| - (_d13 = max(_d1a, _d13)); |
135 |
| - (_d12 = min(_d12, _d13)); |
136 |
| - float3 _d2a = min(_d21, _d22); |
137 |
| - (_d22 = max(_d21, _d22)); |
138 |
| - (_d21 = min(_d2a, _d23)); |
139 |
| - (_d23 = max(_d2a, _d23)); |
140 |
| - (_d22 = min(_d22, _d23)); |
141 |
| - float3 _d3a = min(_d31, _d32); |
142 |
| - (_d32 = max(_d31, _d32)); |
143 |
| - (_d31 = min(_d3a, _d33)); |
144 |
| - (_d33 = max(_d3a, _d33)); |
145 |
| - (_d32 = min(_d32, _d33)); |
146 |
| - float3 _da = min(_d11, _d21); |
147 |
| - (_d21 = max(_d11, _d21)); |
148 |
| - (_d11 = min(_da, _d31)); |
149 |
| - (_d31 = max(_da, _d31)); |
150 |
| - float2 s452 = {0, 0}; |
151 |
| - if ((_d11.x < _d11.y)) |
152 |
| - { |
153 |
| - (s452 = _d11.xy); |
154 |
| - } |
155 |
| - else |
156 |
| - { |
157 |
| - (s452 = _d11.yx); |
158 |
| - } |
159 |
| - (_d11.xy = s452); |
160 |
| - float2 s453 = {0, 0}; |
161 |
| - if ((_d11.x < _d11.z)) |
162 |
| - { |
163 |
| - (s453 = _d11.xz); |
164 |
| - } |
165 |
| - else |
166 |
| - { |
167 |
| - (s453 = _d11.zx); |
168 |
| - } |
169 |
| - (_d11.xz = s453); |
170 |
| - (_d12 = min(_d12, _d21)); |
171 |
| - (_d12 = min(_d12, _d22)); |
172 |
| - (_d12 = min(_d12, _d31)); |
173 |
| - (_d12 = min(_d12, _d32)); |
174 |
| - (_d11.yz = min(_d11.yz, _d12.xy)); |
175 |
| - (_d11.y = min(_d11.y, _d12.z)); |
176 |
| - (_d11.y = min(_d11.y, _d11.z)); |
177 |
| - return sqrt(_d11.xy); |
| 172 | + // Sort out the two smallest distances (F1, F2) |
| 173 | + #if 0 |
| 174 | + // Cheat and sort out only F1 |
| 175 | + vec3 d1 = min(min(d11,d12), d13); |
| 176 | + vec3 d2 = min(min(d21,d22), d23); |
| 177 | + vec3 d3 = min(min(d31,d32), d33); |
| 178 | + vec3 d = min(min(d1,d2), d3); |
| 179 | + d.x = min(min(d.x,d.y),d.z); |
| 180 | + return sqrt(d.xx); // F1 duplicated, no F2 computed |
| 181 | + #else |
| 182 | + // Do it right and sort out both F1 and F2 |
| 183 | + vec3 d1a = min(d11, d12); |
| 184 | + d12 = max(d11, d12); |
| 185 | + d11 = min(d1a, d13); // Smallest now not in d12 or d13 |
| 186 | + d13 = max(d1a, d13); |
| 187 | + d12 = min(d12, d13); // 2nd smallest now not in d13 |
| 188 | + vec3 d2a = min(d21, d22); |
| 189 | + d22 = max(d21, d22); |
| 190 | + d21 = min(d2a, d23); // Smallest now not in d22 or d23 |
| 191 | + d23 = max(d2a, d23); |
| 192 | + d22 = min(d22, d23); // 2nd smallest now not in d23 |
| 193 | + vec3 d3a = min(d31, d32); |
| 194 | + d32 = max(d31, d32); |
| 195 | + d31 = min(d3a, d33); // Smallest now not in d32 or d33 |
| 196 | + d33 = max(d3a, d33); |
| 197 | + d32 = min(d32, d33); // 2nd smallest now not in d33 |
| 198 | + vec3 da = min(d11, d21); |
| 199 | + d21 = max(d11, d21); |
| 200 | + d11 = min(da, d31); // Smallest now in d11 |
| 201 | + d31 = max(da, d31); // 2nd smallest now not in d31 |
| 202 | + d11.xy = (d11.x < d11.y) ? d11.xy : d11.yx; |
| 203 | + d11.xz = (d11.x < d11.z) ? d11.xz : d11.zx; // d11.x now smallest |
| 204 | + d12 = min(d12, d21); // 2nd smallest now not in d21 |
| 205 | + d12 = min(d12, d22); // nor in d22 |
| 206 | + d12 = min(d12, d31); // nor in d31 |
| 207 | + d12 = min(d12, d32); // nor in d32 |
| 208 | + d11.yz = min(d11.yz,d12.xy); // nor in d12.yz |
| 209 | + d11.y = min(d11.y,d12.z); // Only two more to go |
| 210 | + d11.y = min(d11.y,d11.z); // Done! (Phew!) |
| 211 | + return sqrt(d11.xy); // F1, F2 |
| 212 | + #endif |
178 | 213 | }
|
179 | 214 |
|
180 | 215 | v2f vert (appdata v)
|
|
195 | 230 |
|
196 | 231 | float2 _st = i.uv;
|
197 | 232 | (_st *= 10.0);
|
198 |
| - float2 _F = f_cellular(float3(_st, _Time.y)); |
| 233 | + float2 _F = cellular(float3(_st, _Time.y)); |
199 | 234 | float _dots = smoothstep(0.050000001, 0.1, _F.x);
|
200 | 235 | float _n = (_F.y - _F.x);
|
201 | 236 | (_n *= _dots);
|
|
0 commit comments