|
16 | 16 | #pragma fragment frag
|
17 | 17 | // make fog work
|
18 | 18 | #pragma multi_compile_fog
|
19 |
| - |
| 19 | + |
20 | 20 | #include "UnityCG.cginc"
|
21 | 21 |
|
22 | 22 | struct appdata
|
|
34 | 34 |
|
35 | 35 | sampler2D _MainTex;
|
36 | 36 | float4 _MainTex_ST;
|
37 |
| - |
| 37 | + |
38 | 38 | // porting from GLSL
|
39 | 39 | #define vec2 float2
|
40 | 40 | #define vec3 float3
|
41 | 41 | #define vec4 float4
|
42 | 42 | #define mod(x, y) (x - y * floor(x / y))
|
43 | 43 | #define fract frac
|
44 |
| - |
| 44 | + |
45 | 45 | // https://thebookofshaders.com/edit.php#12/3d-cnoise.frag
|
46 | 46 | vec3 permute(vec3 x) {
|
47 | 47 | return mod((34.0 * x + 1.0) * x, 289.0);
|
48 | 48 | }
|
49 |
| - |
| 49 | + |
50 | 50 | // Cellular noise, returning F1 and F2 in a vec2.
|
51 | 51 | // 3x3x3 search region for good F2 everywhere, but a lot
|
52 | 52 | // slower than the 2x2x2 version.
|
53 | 53 | // The code below is a bit scary even to its author,
|
54 | 54 | // but it has at least half decent performance on a
|
55 | 55 | // modern GPU. In any case, it beats any software
|
56 | 56 | // implementation of Worley noise hands down.
|
57 |
| - |
| 57 | + |
58 | 58 | vec2 cellular(vec3 P) {
|
59 | 59 | #define K 0.142857142857 // 1/7
|
60 | 60 | #define Ko 0.428571428571 // 1/2-K/2
|
61 | 61 | #define K2 0.020408163265306 // 1/(7*7)
|
62 | 62 | #define Kz 0.166666666667 // 1/6
|
63 | 63 | #define Kzo 0.416666666667 // 1/2-1/6*2
|
64 | 64 | #define jitter 1.0 // smaller jitter gives more regular pattern
|
65 |
| - |
| 65 | + |
66 | 66 | vec3 Pi = mod(floor(P), 289.0);
|
67 | 67 | vec3 Pf = fract(P) - 0.5;
|
68 |
| - |
| 68 | + |
69 | 69 | vec3 Pfx = Pf.x + vec3(1.0, 0.0, -1.0);
|
70 | 70 | vec3 Pfy = Pf.y + vec3(1.0, 0.0, -1.0);
|
71 | 71 | vec3 Pfz = Pf.z + vec3(1.0, 0.0, -1.0);
|
72 |
| - |
| 72 | + |
73 | 73 | vec3 p = permute(Pi.x + vec3(-1.0, 0.0, 1.0));
|
74 | 74 | vec3 p1 = permute(p + Pi.y - 1.0);
|
75 | 75 | vec3 p2 = permute(p + Pi.y);
|
76 | 76 | vec3 p3 = permute(p + Pi.y + 1.0);
|
77 |
| - |
| 77 | + |
78 | 78 | vec3 p11 = permute(p1 + Pi.z - 1.0);
|
79 | 79 | vec3 p12 = permute(p1 + Pi.z);
|
80 | 80 | vec3 p13 = permute(p1 + Pi.z + 1.0);
|
81 |
| - |
| 81 | + |
82 | 82 | vec3 p21 = permute(p2 + Pi.z - 1.0);
|
83 | 83 | vec3 p22 = permute(p2 + Pi.z);
|
84 | 84 | vec3 p23 = permute(p2 + Pi.z + 1.0);
|
85 |
| - |
| 85 | + |
86 | 86 | vec3 p31 = permute(p3 + Pi.z - 1.0);
|
87 | 87 | vec3 p32 = permute(p3 + Pi.z);
|
88 | 88 | vec3 p33 = permute(p3 + Pi.z + 1.0);
|
89 |
| - |
| 89 | + |
90 | 90 | vec3 ox11 = fract(p11*K) - Ko;
|
91 | 91 | vec3 oy11 = mod(floor(p11*K), 7.0)*K - Ko;
|
92 | 92 | vec3 oz11 = floor(p11*K2)*Kz - Kzo; // p11 < 289 guaranteed
|
93 |
| - |
| 93 | + |
94 | 94 | vec3 ox12 = fract(p12*K) - Ko;
|
95 | 95 | vec3 oy12 = mod(floor(p12*K), 7.0)*K - Ko;
|
96 | 96 | vec3 oz12 = floor(p12*K2)*Kz - Kzo;
|
97 |
| - |
| 97 | + |
98 | 98 | vec3 ox13 = fract(p13*K) - Ko;
|
99 | 99 | vec3 oy13 = mod(floor(p13*K), 7.0)*K - Ko;
|
100 | 100 | vec3 oz13 = floor(p13*K2)*Kz - Kzo;
|
101 |
| - |
| 101 | + |
102 | 102 | vec3 ox21 = fract(p21*K) - Ko;
|
103 | 103 | vec3 oy21 = mod(floor(p21*K), 7.0)*K - Ko;
|
104 | 104 | vec3 oz21 = floor(p21*K2)*Kz - Kzo;
|
105 |
| - |
| 105 | + |
106 | 106 | vec3 ox22 = fract(p22*K) - Ko;
|
107 | 107 | vec3 oy22 = mod(floor(p22*K), 7.0)*K - Ko;
|
108 | 108 | vec3 oz22 = floor(p22*K2)*Kz - Kzo;
|
109 |
| - |
| 109 | + |
110 | 110 | vec3 ox23 = fract(p23*K) - Ko;
|
111 | 111 | vec3 oy23 = mod(floor(p23*K), 7.0)*K - Ko;
|
112 | 112 | vec3 oz23 = floor(p23*K2)*Kz - Kzo;
|
113 |
| - |
| 113 | + |
114 | 114 | vec3 ox31 = fract(p31*K) - Ko;
|
115 | 115 | vec3 oy31 = mod(floor(p31*K), 7.0)*K - Ko;
|
116 | 116 | vec3 oz31 = floor(p31*K2)*Kz - Kzo;
|
117 |
| - |
| 117 | + |
118 | 118 | vec3 ox32 = fract(p32*K) - Ko;
|
119 | 119 | vec3 oy32 = mod(floor(p32*K), 7.0)*K - Ko;
|
120 | 120 | vec3 oz32 = floor(p32*K2)*Kz - Kzo;
|
121 |
| - |
| 121 | + |
122 | 122 | vec3 ox33 = fract(p33*K) - Ko;
|
123 | 123 | vec3 oy33 = mod(floor(p33*K), 7.0)*K - Ko;
|
124 | 124 | vec3 oz33 = floor(p33*K2)*Kz - Kzo;
|
125 |
| - |
| 125 | + |
126 | 126 | vec3 dx11 = Pfx + jitter*ox11;
|
127 | 127 | vec3 dy11 = Pfy.x + jitter*oy11;
|
128 | 128 | vec3 dz11 = Pfz.x + jitter*oz11;
|
129 |
| - |
| 129 | + |
130 | 130 | vec3 dx12 = Pfx + jitter*ox12;
|
131 | 131 | vec3 dy12 = Pfy.x + jitter*oy12;
|
132 | 132 | vec3 dz12 = Pfz.y + jitter*oz12;
|
133 |
| - |
| 133 | + |
134 | 134 | vec3 dx13 = Pfx + jitter*ox13;
|
135 | 135 | vec3 dy13 = Pfy.x + jitter*oy13;
|
136 | 136 | vec3 dz13 = Pfz.z + jitter*oz13;
|
137 |
| - |
| 137 | + |
138 | 138 | vec3 dx21 = Pfx + jitter*ox21;
|
139 | 139 | vec3 dy21 = Pfy.y + jitter*oy21;
|
140 | 140 | vec3 dz21 = Pfz.x + jitter*oz21;
|
141 |
| - |
| 141 | + |
142 | 142 | vec3 dx22 = Pfx + jitter*ox22;
|
143 | 143 | vec3 dy22 = Pfy.y + jitter*oy22;
|
144 | 144 | vec3 dz22 = Pfz.y + jitter*oz22;
|
145 |
| - |
| 145 | + |
146 | 146 | vec3 dx23 = Pfx + jitter*ox23;
|
147 | 147 | vec3 dy23 = Pfy.y + jitter*oy23;
|
148 | 148 | vec3 dz23 = Pfz.z + jitter*oz23;
|
149 |
| - |
| 149 | + |
150 | 150 | vec3 dx31 = Pfx + jitter*ox31;
|
151 | 151 | vec3 dy31 = Pfy.z + jitter*oy31;
|
152 | 152 | vec3 dz31 = Pfz.x + jitter*oz31;
|
153 |
| - |
| 153 | + |
154 | 154 | vec3 dx32 = Pfx + jitter*ox32;
|
155 | 155 | vec3 dy32 = Pfy.z + jitter*oy32;
|
156 | 156 | vec3 dz32 = Pfz.y + jitter*oz32;
|
157 |
| - |
| 157 | + |
158 | 158 | vec3 dx33 = Pfx + jitter*ox33;
|
159 | 159 | vec3 dy33 = Pfy.z + jitter*oy33;
|
160 | 160 | vec3 dz33 = Pfz.z + jitter*oz33;
|
161 |
| - |
| 161 | + |
162 | 162 | vec3 d11 = dx11 * dx11 + dy11 * dy11 + dz11 * dz11;
|
163 | 163 | vec3 d12 = dx12 * dx12 + dy12 * dy12 + dz12 * dz12;
|
164 | 164 | vec3 d13 = dx13 * dx13 + dy13 * dy13 + dz13 * dz13;
|
|
168 | 168 | vec3 d31 = dx31 * dx31 + dy31 * dy31 + dz31 * dz31;
|
169 | 169 | vec3 d32 = dx32 * dx32 + dy32 * dy32 + dz32 * dz32;
|
170 | 170 | vec3 d33 = dx33 * dx33 + dy33 * dy33 + dz33 * dz33;
|
171 |
| - |
| 171 | + |
172 | 172 | // Sort out the two smallest distances (F1, F2)
|
173 | 173 | #if 0
|
174 | 174 | // Cheat and sort out only F1
|
|
211 | 211 | return sqrt(d11.xy); // F1, F2
|
212 | 212 | #endif
|
213 | 213 | }
|
214 |
| - |
215 |
| - v2f vert (appdata v) |
216 |
| - { |
217 |
| - v2f o; |
218 |
| - o.vertex = UnityObjectToClipPos(v.vertex); |
219 |
| - o.uv = TRANSFORM_TEX(v.uv, _MainTex); |
220 |
| - UNITY_TRANSFER_FOG(o,o.vertex); |
221 |
| - return o; |
222 |
| - } |
223 |
| - |
224 |
| - fixed4 frag (v2f i) : SV_Target |
225 |
| - { |
226 |
| - // sample the texture |
227 |
| - //fixed4 col = tex2D(_MainTex, i.uv); |
228 |
| - // apply fog |
229 |
| - //UNITY_APPLY_FOG(i.fogCoord, col); |
230 |
| - |
231 |
| - float2 _st = i.uv; |
| 214 | + |
| 215 | + v2f vert (appdata v) |
| 216 | + { |
| 217 | + v2f o; |
| 218 | + o.vertex = UnityObjectToClipPos(v.vertex); |
| 219 | + o.uv = TRANSFORM_TEX(v.uv, _MainTex); |
| 220 | + UNITY_TRANSFER_FOG(o,o.vertex); |
| 221 | + return o; |
| 222 | + } |
| 223 | + |
| 224 | + fixed4 frag (v2f i) : SV_Target |
| 225 | + { |
| 226 | + // sample the texture |
| 227 | + //fixed4 col = tex2D(_MainTex, i.uv); |
| 228 | + // apply fog |
| 229 | + //UNITY_APPLY_FOG(i.fogCoord, col); |
| 230 | + |
| 231 | + float2 _st = i.uv; |
232 | 232 | (_st *= 10.0);
|
233 | 233 | float2 _F = cellular(float3(_st, _Time.y));
|
234 | 234 | float _dots = smoothstep(0.050000001, 0.1, _F.x);
|
235 | 235 | float _n = (_F.y - _F.x);
|
236 | 236 | (_n *= _dots);
|
237 |
| - |
238 |
| - return fixed4(_n, _n, _n, 1.0); |
239 |
| - } |
| 237 | + |
| 238 | + return fixed4(_n, _n, _n, 1.0); |
| 239 | + } |
240 | 240 | ENDCG
|
241 | 241 | }
|
242 | 242 | }
|
|
0 commit comments