Skip to content

Commit 8ddb9ef

Browse files
committed
Use define macro for porting from GLSL
1 parent f504338 commit 8ddb9ef

File tree

2 files changed

+174
-139
lines changed

2 files changed

+174
-139
lines changed

.idea/.idea.unity-demoscene/.idea/contentModel.xml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Demoscene/Projects/2018-07-10-Cellular/Cellular.shader

Lines changed: 173 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -35,146 +35,181 @@
3535
sampler2D _MainTex;
3636
float4 _MainTex_ST;
3737

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);
4148
}
4249

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;
47171

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
178213
}
179214

180215
v2f vert (appdata v)
@@ -195,7 +230,7 @@
195230

196231
float2 _st = i.uv;
197232
(_st *= 10.0);
198-
float2 _F = f_cellular(float3(_st, _Time.y));
233+
float2 _F = cellular(float3(_st, _Time.y));
199234
float _dots = smoothstep(0.050000001, 0.1, _F.x);
200235
float _n = (_F.y - _F.x);
201236
(_n *= _dots);

0 commit comments

Comments
 (0)