• Sign Up
• Login
• API
• FAQ
• Tools
• Archive
SHARE
TWEET

# simplex hlsl

a guest Jul 15th, 2013 1,517 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
1. int simplexSeed;
2.
3. int hash(int a)
4. {
5.     a = (a ^ 61) ^ (a >> 16);
6.     a = a + (a << 3);
7.     a = a ^ (a >> 4);
8.     a = a * simplexSeed;
9.     a = a ^ (a >> 15);
10.     return a;
11. }
12.
13. /*
14. ** 1D
15. */
16.
17. void grad1( int hash,  out float gx )
18. {
19.     int h = hash & 15;
20.     gx = 1.0f + (h & 7);
21.     if (h&8) gx = -gx;
22. }
23.
24. float noise( float x )
25. {
26.   int i0 = floor(x);
27.   int i1 = i0 + 1;
28.   float x0 = x - i0;
29.   float x1 = x0 - 1.0f;
30.
31.   float gx0, gx1;
32.   float n0, n1;
33.   float t20, t40, t21, t41;
34.
35.   float x20 = x0 * x0;
36.   float t0 = 1.0f - x20;
37.   t20 = t0 * t0;
38.   t40 = t20 * t20;
39.   grad1(hash(i0 & 0xff), gx0);
40.   n0 = t40 * gx0 * x0;
41.
42.   float x21 = x1*x1;
43.   float t1 = 1.0f - x21;
44.   t21 = t1 * t1;
45.   t41 = t21 * t21;
46.   grad1(hash(i1 & 0xff), gx1);
47.   n1 = t41 * gx1 * x1;
48.
49.   return 0.25f * (n0 + n1);
50. }
51.
52. float noise (float x, out float dnoise_dx)
53. {
54.   int i0 = floor(x);
55.   int i1 = i0 + 1;
56.   float x0 = x - i0;
57.   float x1 = x0 - 1.0f;
58.
59.   float gx0, gx1;
60.   float n0, n1;
61.   float t20, t40, t21, t41;
62.
63.   float x20 = x0 * x0;
64.   float t0 = 1.0f - x20;
65.   t20 = t0 * t0;
66.   t40 = t20 * t20;
67.   grad1(hash(i0 & 0xff), gx0);
68.   n0 = t40 * gx0 * x0;
69.
70.   float x21 = x1*x1;
71.   float t1 = 1.0f - x21;
72.   t21 = t1 * t1;
73.   t41 = t21 * t21;
74.   grad1(hash(i1 & 0xff), gx1);
75.   n1 = t41 * gx1 * x1;
76.
77.   dnoise_dx = t20 * t0 * gx0 * x20;
78.   dnoise_dx += t21 * t1 * gx1 * x21;
79.   dnoise_dx *= -8.0f;
80.   dnoise_dx += t40 * gx0 + t41 * gx1;
81.   dnoise_dx *= 0.1;
82.   return 0.25f * (n0 + n1);
83. }
84.
85. /*
86. ** 2D
87. */
88.
89. static    float2 grad2lut[8] =
90.    {
91.      { -1.0f, -1.0f }, { 1.0f, 0.0f } , { -1.0f, 0.0f } , { 1.0f, 1.0f } ,
92.      { -1.0f, 1.0f } , { 0.0f, -1.0f } , { 0.0f, 1.0f } , { 1.0f, -1.0f }
93.    };
94.
95. float2 grad2( int hash)
96. {
97.     return grad2lut[hash & 7];
98. }
99.
100. float noise( float2 input)
101.   {
102.     float n0, n1, n2;
103.     float2 g0, g1, g2;
104.
105.     float s = ( input.x + input.y ) * 0.366025403f;
106.     float2 a = input + s;
107.     int2 ij = floor( a );
108.
109.     float t = ( float ) ( ij.x + ij.y ) * 0.211324865f;
110.     float2 b = ij - t;
111.     float2 c = input - b;
112.
113.     int2 ij1 = c.x > c.y ? float2(1,0) : float2(0,1);
114.
115.    float2 c1 = c - ij1 + 0.211324865f;
116.    float2 c2 = c - 1.0f + 2.0f * 0.211324865f;
117.
118.     int ii = ij.x & 0xff;
119.     int jj = ij.y & 0xff;
120.
121.     float t0 = 0.5f - c.x * c.x - c.y * c.y;
122.     float t20, t40;
123.     if( t0 < 0.0f ) t40 = t20 = t0 = n0 = g0.x = g0.y = 0.0f;
124.     else
125.     {
126.       g0 = grad2( hash(ii + hash(jj)));
127.       t20 = t0 * t0;
128.       t40 = t20 * t20;
129.       n0 = t40 * ( g0.x * c.x + g0.y * c.y );
130.     }
131.
132.     float t1 = 0.5f - c1.x * c1.x - c1.y * c1.y;
133.     float t21, t41;
134.     if( t1 < 0.0f ) t21 = t41 = t1 = n1 = g1.x = g1.y = 0.0f;
135.     else
136.     {
137.       g1 = grad2( hash(ii + ij1.x + hash(jj + ij1.y)));
138.       t21 = t1 * t1;
139.       t41 = t21 * t21;
140.       n1 = t41 * ( g1.x * c1.x + g1.y * c1.y );
141.     }
142.
143.     float t2 = 0.5f - c2.x * c2.x - c2.y * c2.y;
144.     float t22, t42;
145.     if( t2 < 0.0f ) t42 = t22 = t2 = n2 = g2.x = g2.y = 0.0f;
146.     else
147.     {
148.       g2 = grad2( hash(ii + 1 + hash(jj + 1)));
149.       t22 = t2 * t2;
150.       t42 = t22 * t22;
151.       n2 = t42 * ( g2.x * c2.x + g2.y * c2.y );
152.     }
153.
154.     float noise = 40.0f * ( n0 + n1 + n2 );
155.     return noise;
156.   }
157.
158. float noise( float2 input, out float2 derivative)
159.   {
160.     float n0, n1, n2;
161.     float2 g0, g1, g2;
162.
163.     float s = ( input.x + input.y ) * 0.366025403f;
164.     float2 a = input + s;
165.     int2 ij = floor( a );
166.
167.     float t = ( float ) ( ij.x + ij.y ) * 0.211324865f;
168.     float2 b = ij - t;
169.     float2 c = input - b;
170.
171.     int2 ij1 = c.x > c.y ? float2(1,0) : float2(0,1);
172.
173.    float2 c1 = c - ij1 + 0.211324865f;
174.    float2 c2 = c - 1.0f + 2.0f * 0.211324865f;
175.
176.     int ii = ij.x & 0xff;
177.     int jj = ij.y & 0xff;
178.
179.     float t0 = 0.5f - c.x * c.x - c.y * c.y;
180.     float t20, t40;
181.     if( t0 < 0.0f ) t40 = t20 = t0 = n0 = g0.x = g0.y = 0.0f;
182.     else
183.     {
184.       g0 = grad2( hash(ii + hash(jj)));
185.       t20 = t0 * t0;
186.       t40 = t20 * t20;
187.       n0 = t40 * ( g0.x * c.x + g0.y * c.y );
188.     }
189.
190.     float t1 = 0.5f - c1.x * c1.x - c1.y * c1.y;
191.     float t21, t41;
192.     if( t1 < 0.0f ) t21 = t41 = t1 = n1 = g1.x = g1.y = 0.0f;
193.     else
194.     {
195.       g1 = grad2( hash(ii + ij1.x + hash(jj + ij1.y)));
196.       t21 = t1 * t1;
197.       t41 = t21 * t21;
198.       n1 = t41 * ( g1.x * c1.x + g1.y * c1.y );
199.     }
200.
201.     float t2 = 0.5f - c2.x * c2.x - c2.y * c2.y;
202.     float t22, t42;
203.     if( t2 < 0.0f ) t42 = t22 = t2 = n2 = g2.x = g2.y = 0.0f;
204.     else
205.     {
206.       g2 = grad2( hash(ii + 1 + hash(jj + 1)));
207.       t22 = t2 * t2;
208.       t42 = t22 * t22;
209.       n2 = t42 * ( g2.x * c2.x + g2.y * c2.y );
210.     }
211.
212.     float noise = 40.0f * ( n0 + n1 + n2 );
213.
214.     float temp0 = t20 * t0 * ( g0.x * c.x + g0.y * c.y );
215.     float temp1 = t21 * t1 * ( g1.x * c1.x + g1.y * c1.y );
216.     float temp2 = t22 * t2 * ( g2.x * c2.x + g2.y * c2.y );
217.     derivative = ((temp0 * c + temp1 * c1 + temp2 * c2) * -8 + (t40 * g0 + t41 * g1 + t42 * g2)) * 40;
218.
219.     return noise;
220.   }
221.
222.   /*
223.   ** 3D
224.   */
225.
226.    static float3 grad3lut[16] =
227.    {
228.      { 1.0f, 0.0f, 1.0f }, { 0.0f, 1.0f, 1.0f },
229.      { -1.0f, 0.0f, 1.0f }, { 0.0f, -1.0f, 1.0f },
230.      { 1.0f, 0.0f, -1.0f }, { 0.0f, 1.0f, -1.0f },
231.      { -1.0f, 0.0f, -1.0f }, { 0.0f, -1.0f, -1.0f },
232.      { 1.0f, -1.0f, 0.0f }, { 1.0f, 1.0f, 0.0f },
233.      { -1.0f, 1.0f, 0.0f }, { -1.0f, -1.0f, 0.0f },
234.      { 1.0f, 0.0f, 1.0f }, { -1.0f, 0.0f, 1.0f },
235.      { 0.0f, 1.0f, -1.0f }, { 0.0f, -1.0f, -1.0f }
236.    };
237.
238.    float3 grad3(int hash)
239.    {
240.       return grad3lut[hash & 15];
241.    }
242.
243.   float simplexNoise(float3 input)
244.   {
245.     float n0, n1, n2, n3;
246.     float noise;
247.     float3 g0, g1, g2, g3;
248.
249.     float s = (input.x + input.y + input.z) * 0.333333333;
250.     float3 a = input + s;
251.     int3 ijk = floor(a);
252.
253.     float t = (float)(ijk.x + ijk.y + ijk.z) * 0.166666667;
254.     float3 b = ijk - t;
255.    float3 c = input - b;
256.
257.    int3 ijk1;
258.    int3 ijk2;
259.
260.     if(c.x >= c.y) {
261.       if(c.y >= c.z)
262.         { ijk1 = int3(1, 0, 0); ijk2 = int3(1,1,0); }
263.         else if(c.x >= c.z) { ijk1 = int3(1, 0, 0); ijk2 = int3(1,0,1); }
264.         else { ijk1 = int3(0, 0, 1); ijk2 = int3(1,0,1); }
265.       }
266.     else {
267.       if(c.y < c.z) { ijk1 = int3(0, 0, 1); ijk2 = int3(0,1,1); }
268.       else if(c.x < c.z) { ijk1 = int3(0, 1, 0); ijk2 = int3(0,1,1); }
269.       else { ijk1 = int3(0, 1, 0); ijk2 = int3(1,1,0); }
270.     }
271.
272.     float3 c1 = c - ijk1 + 0.166666667;
273.    float3 c2 = c - ijk2 + 2.0f * 0.166666667;
274.    float3 c3 = c - 1.0f + 3.0f * 0.166666667;
275.
276.     int ii = ijk.x & 0xff;
277.     int jj = ijk.y & 0xff;
278.     int kk = ijk.z & 0xff;
279.
280.     float t0 = 0.6f - c.x * c.x - c.y * c.y - c.z * c.z;
281.     float t20, t40;
282.     if(t0 < 0.0f) n0 = t0 = t20 = t40 = g0.x = g0.y = g0.z = 0.0f;
283.     else {
284.       g0 = grad3( hash(ii + hash(jj + hash(kk))));
285.       t20 = t0 * t0;
286.       t40 = t20 * t20;
287.       n0 = t40 * ( g0.x * c.x + g0.y * c.y + g0.z * c.z );
288.     }
289.
290.     float t1 = 0.6f - c1.x * c1.x -  c1.y * c1.y - c1.z * c1.z;
291.     float t21, t41;
292.     if(t1 < 0.0f) n1 = t1 = t21 = t41 = g1.x = g1.y = g1.z = 0.0f;
293.     else {
294.       g1 = grad3( hash(ii + ijk1.x + hash(jj + ijk1.y + hash(kk + ijk1.z))));
295.       t21 = t1 * t1;
296.       t41 = t21 * t21;
297.       n1 = t41 * ( g1.x * c1.x + g1.y * c1.y + g1.z * c1.z );
298.     }
299.
300.     float t2 = 0.6f - c2.x * c2.x - c2.y * c2.y - c2.z * c2.z;
301.     float t22, t42;
302.     if(t2 < 0.0f) n2 = t2 = t22 = t42 = g2.x = g2.y = g2.z = 0.0f;
303.     else {
304.       g2 = grad3( hash(ii + ijk2.x + hash(jj + ijk2.y + hash(kk + ijk2.z))));
305.       t22 = t2 * t2;
306.       t42 = t22 * t22;
307.       n2 = t42 * ( g2.x * c2.x + g2.y * c2.y + g2.z * c2.z );
308.     }
309.
310.     float t3 = 0.6f - c3.x * c3.x - c3.y * c3.y - c3.z * c3.z;
311.     float t23, t43;
312.     if(t3 < 0.0f) n3 = t3 = t23 = t43 = g3.x = g3.y = g3.z = 0.0f;
313.     else {
314.       g3 = grad3( hash(ii + 1 + hash(jj + 1 + hash(kk + 1))));
315.       t23 = t3 * t3;
316.       t43 = t23 * t23;
317.       n3 = t43 * ( g3.x * c3.x + g3.y * c3.y + g3.z * c3.z );
318.     }
319.
320.     noise = 20.0f * (n0 + n1 + n2 + n3);
321.     return noise;
322. }
323.
324.   float simplexNoise( float3 input, out float3 derivative)
325.   {
326.     float n0, n1, n2, n3;
327.     float noise;
328.     float3 g0, g1, g2, g3;
329.
330.     float s = (input.x + input.y + input.z) * 0.333333333;
331.     float3 a = input + s;
332.     int3 ijk = floor(a);
333.
334.     float t = (float)(ijk.x + ijk.y + ijk.z) * 0.166666667;
335.     float3 b = ijk - t;
336.    float3 c = input - b;
337.
338.    int3 ijk1;
339.    int3 ijk2;
340.
341.     if(c.x >= c.y) {
342.       if(c.y >= c.z)
343.         { ijk1 = int3(1, 0, 0); ijk2 = int3(1,1,0); }
344.         else if(c.x >= c.z) { ijk1 = int3(1, 0, 0); ijk2 = int3(1,0,1); }
345.         else { ijk1 = int3(0, 0, 1); ijk2 = int3(1,0,1); }
346.       }
347.     else {
348.       if(c.y < c.z) { ijk1 = int3(0, 0, 1); ijk2 = int3(0,1,1); }
349.       else if(c.x < c.z) { ijk1 = int3(0, 1, 0); ijk2 = int3(0,1,1); }
350.       else { ijk1 = int3(0, 1, 0); ijk2 = int3(1,1,0); }
351.     }
352.
353.     float3 c1 = c - ijk1 + 0.166666667;
354.    float3 c2 = c - ijk2 + 2.0f * 0.166666667;
355.    float3 c3 = c - 1.0f + 3.0f * 0.166666667;
356.
357.     int ii = ijk.x & 0xff;
358.     int jj = ijk.y & 0xff;
359.     int kk = ijk.z & 0xff;
360.
361.     float t0 = 0.6f - c.x * c.x - c.y * c.y - c.z * c.z;
362.     float t20, t40;
363.     if(t0 < 0.0f) n0 = t0 = t20 = t40 = g0.x = g0.y = g0.z = 0.0f;
364.     else {
365.       g0 = grad3( hash(ii + hash(jj + hash(kk))));
366.       t20 = t0 * t0;
367.       t40 = t20 * t20;
368.       n0 = t40 * ( g0.x * c.x + g0.y * c.y + g0.z * c.z );
369.     }
370.
371.     float t1 = 0.6f - c1.x * c1.x -  c1.y * c1.y - c1.z * c1.z;
372.     float t21, t41;
373.     if(t1 < 0.0f) n1 = t1 = t21 = t41 = g1.x = g1.y = g1.z = 0.0f;
374.     else {
375.       g1 = grad3( hash(ii + ijk1.x + hash(jj + ijk1.y + hash(kk + ijk1.z))));
376.       t21 = t1 * t1;
377.       t41 = t21 * t21;
378.       n1 = t41 * ( g1.x * c1.x + g1.y * c1.y + g1.z * c1.z );
379.     }
380.
381.     float t2 = 0.6f - c2.x * c2.x - c2.y * c2.y - c2.z * c2.z;
382.     float t22, t42;
383.     if(t2 < 0.0f) n2 = t2 = t22 = t42 = g2.x = g2.y = g2.z = 0.0f;
384.     else {
385.       g2 = grad3( hash(ii + ijk2.x + hash(jj + ijk2.y + hash(kk + ijk2.z))));
386.       t22 = t2 * t2;
387.       t42 = t22 * t22;
388.       n2 = t42 * ( g2.x * c2.x + g2.y * c2.y + g2.z * c2.z );
389.     }
390.
391.     float t3 = 0.6f - c3.x * c3.x - c3.y * c3.y - c3.z * c3.z;
392.     float t23, t43;
393.     if(t3 < 0.0f) n3 = t3 = t23 = t43 = g3.x = g3.y = g3.z = 0.0f;
394.     else {
395.       g3 = grad3( hash(ii + 1 + hash(jj + 1 + hash(kk + 1))));
396.       t23 = t3 * t3;
397.       t43 = t23 * t23;
398.       n3 = t43 * ( g3.x * c3.x + g3.y * c3.y + g3.z * c3.z );
399.     }
400.
401.     noise = 20.0f * (n0 + n1 + n2 + n3);
402.
403.     float temp0 = t20 * t0 * ( g0.x * c.x + g0.y * c.y + g0.z * c.z );
404.     derivative = temp0 * c;
405.     float temp1 = t21 * t1 * ( g1.x * c1.x + g1.y * c1.y + g1.z * c1.z );
406.     derivative += temp1 * c1;
407.     float temp2 = t22 * t2 * ( g2.x * c2.x + g2.y * c2.y + g2.z * c2.z );
408.     derivative += temp2 * c2;
409.     float temp3 = t23 * t3 * ( g3.x * c3.x + g3.y * c3.y + g3.z * c3.z );
410.     derivative += temp3 * c3;
411.     derivative *= -8.0f;
412.     derivative += t40 * g0 + t41 * g1 + t42 * g2 + t43 * g3;
413.     derivative *= 28.0f;
414.
415.     return noise;
416. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy.

Top