No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

cellular3D.cs 7.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. // Cellular noise ("Worley noise") in 3D in GLSL.
  2. // Copyright (c) Stefan Gustavson 2011-04-19. All rights reserved.
  3. // This code is released under the conditions of the MIT license.
  4. // See LICENSE file for details.
  5. // https://github.com/stegu/webgl-noise
  6. using static Unity.Mathematics.math;
  7. namespace Unity.Mathematics
  8. {
  9. public static partial class noise
  10. {
  11. /// <summary>
  12. /// 3D Cellular noise ("Worley noise") with 3x3x3 search region for good F2 everywhere, but a lot slower than the 2x2x2 version.
  13. /// </summary>
  14. /// <param name="P">A point in 2D space.</param>
  15. /// <returns>Feature points. F1 is in the x component, F2 in the y component.</returns>
  16. // The code below is a bit scary even to its author,
  17. // but it has at least half decent performance on a
  18. // math.modern GPU. In any case, it beats any software
  19. // implementation of Worley noise hands down.
  20. public static float2 cellular(float3 P)
  21. {
  22. const float K = 0.142857142857f; // 1/7
  23. const float Ko = 0.428571428571f; // 1/2-K/2
  24. const float K2 = 0.020408163265306f; // 1/(7*7)
  25. const float Kz = 0.166666666667f; // 1/6
  26. const float Kzo = 0.416666666667f; // 1/2-1/6*2
  27. const float jitter = 1.0f; // smaller jitter gives more regular pattern
  28. float3 Pi = mod289(floor(P));
  29. float3 Pf = frac(P) - 0.5f;
  30. float3 Pfx = Pf.x + float3(1.0f, 0.0f, -1.0f);
  31. float3 Pfy = Pf.y + float3(1.0f, 0.0f, -1.0f);
  32. float3 Pfz = Pf.z + float3(1.0f, 0.0f, -1.0f);
  33. float3 p = permute(Pi.x + float3(-1.0f, 0.0f, 1.0f));
  34. float3 p1 = permute(p + Pi.y - 1.0f);
  35. float3 p2 = permute(p + Pi.y);
  36. float3 p3 = permute(p + Pi.y + 1.0f);
  37. float3 p11 = permute(p1 + Pi.z - 1.0f);
  38. float3 p12 = permute(p1 + Pi.z);
  39. float3 p13 = permute(p1 + Pi.z + 1.0f);
  40. float3 p21 = permute(p2 + Pi.z - 1.0f);
  41. float3 p22 = permute(p2 + Pi.z);
  42. float3 p23 = permute(p2 + Pi.z + 1.0f);
  43. float3 p31 = permute(p3 + Pi.z - 1.0f);
  44. float3 p32 = permute(p3 + Pi.z);
  45. float3 p33 = permute(p3 + Pi.z + 1.0f);
  46. float3 ox11 = frac(p11 * K) - Ko;
  47. float3 oy11 = mod7(floor(p11 * K)) * K - Ko;
  48. float3 oz11 = floor(p11 * K2) * Kz - Kzo; // p11 < 289 guaranteed
  49. float3 ox12 = frac(p12 * K) - Ko;
  50. float3 oy12 = mod7(floor(p12 * K)) * K - Ko;
  51. float3 oz12 = floor(p12 * K2) * Kz - Kzo;
  52. float3 ox13 = frac(p13 * K) - Ko;
  53. float3 oy13 = mod7(floor(p13 * K)) * K - Ko;
  54. float3 oz13 = floor(p13 * K2) * Kz - Kzo;
  55. float3 ox21 = frac(p21 * K) - Ko;
  56. float3 oy21 = mod7(floor(p21 * K)) * K - Ko;
  57. float3 oz21 = floor(p21 * K2) * Kz - Kzo;
  58. float3 ox22 = frac(p22 * K) - Ko;
  59. float3 oy22 = mod7(floor(p22 * K)) * K - Ko;
  60. float3 oz22 = floor(p22 * K2) * Kz - Kzo;
  61. float3 ox23 = frac(p23 * K) - Ko;
  62. float3 oy23 = mod7(floor(p23 * K)) * K - Ko;
  63. float3 oz23 = floor(p23 * K2) * Kz - Kzo;
  64. float3 ox31 = frac(p31 * K) - Ko;
  65. float3 oy31 = mod7(floor(p31 * K)) * K - Ko;
  66. float3 oz31 = floor(p31 * K2) * Kz - Kzo;
  67. float3 ox32 = frac(p32 * K) - Ko;
  68. float3 oy32 = mod7(floor(p32 * K)) * K - Ko;
  69. float3 oz32 = floor(p32 * K2) * Kz - Kzo;
  70. float3 ox33 = frac(p33 * K) - Ko;
  71. float3 oy33 = mod7(floor(p33 * K)) * K - Ko;
  72. float3 oz33 = floor(p33 * K2) * Kz - Kzo;
  73. float3 dx11 = Pfx + jitter * ox11;
  74. float3 dy11 = Pfy.x + jitter * oy11;
  75. float3 dz11 = Pfz.x + jitter * oz11;
  76. float3 dx12 = Pfx + jitter * ox12;
  77. float3 dy12 = Pfy.x + jitter * oy12;
  78. float3 dz12 = Pfz.y + jitter * oz12;
  79. float3 dx13 = Pfx + jitter * ox13;
  80. float3 dy13 = Pfy.x + jitter * oy13;
  81. float3 dz13 = Pfz.z + jitter * oz13;
  82. float3 dx21 = Pfx + jitter * ox21;
  83. float3 dy21 = Pfy.y + jitter * oy21;
  84. float3 dz21 = Pfz.x + jitter * oz21;
  85. float3 dx22 = Pfx + jitter * ox22;
  86. float3 dy22 = Pfy.y + jitter * oy22;
  87. float3 dz22 = Pfz.y + jitter * oz22;
  88. float3 dx23 = Pfx + jitter * ox23;
  89. float3 dy23 = Pfy.y + jitter * oy23;
  90. float3 dz23 = Pfz.z + jitter * oz23;
  91. float3 dx31 = Pfx + jitter * ox31;
  92. float3 dy31 = Pfy.z + jitter * oy31;
  93. float3 dz31 = Pfz.x + jitter * oz31;
  94. float3 dx32 = Pfx + jitter * ox32;
  95. float3 dy32 = Pfy.z + jitter * oy32;
  96. float3 dz32 = Pfz.y + jitter * oz32;
  97. float3 dx33 = Pfx + jitter * ox33;
  98. float3 dy33 = Pfy.z + jitter * oy33;
  99. float3 dz33 = Pfz.z + jitter * oz33;
  100. float3 d11 = dx11 * dx11 + dy11 * dy11 + dz11 * dz11;
  101. float3 d12 = dx12 * dx12 + dy12 * dy12 + dz12 * dz12;
  102. float3 d13 = dx13 * dx13 + dy13 * dy13 + dz13 * dz13;
  103. float3 d21 = dx21 * dx21 + dy21 * dy21 + dz21 * dz21;
  104. float3 d22 = dx22 * dx22 + dy22 * dy22 + dz22 * dz22;
  105. float3 d23 = dx23 * dx23 + dy23 * dy23 + dz23 * dz23;
  106. float3 d31 = dx31 * dx31 + dy31 * dy31 + dz31 * dz31;
  107. float3 d32 = dx32 * dx32 + dy32 * dy32 + dz32 * dz32;
  108. float3 d33 = dx33 * dx33 + dy33 * dy33 + dz33 * dz33;
  109. // Sort out the two smallest distances (F1, F2)
  110. // Do it right and sort out both F1 and F2
  111. float3 d1a = min(d11, d12);
  112. d12 = max(d11, d12);
  113. d11 = min(d1a, d13); // Smallest now not in d12 or d13
  114. d13 = max(d1a, d13);
  115. d12 = min(d12, d13); // 2nd smallest now not in d13
  116. float3 d2a = min(d21, d22);
  117. d22 = max(d21, d22);
  118. d21 = min(d2a, d23); // Smallest now not in d22 or d23
  119. d23 = max(d2a, d23);
  120. d22 = min(d22, d23); // 2nd smallest now not in d23
  121. float3 d3a = min(d31, d32);
  122. d32 = max(d31, d32);
  123. d31 = min(d3a, d33); // Smallest now not in d32 or d33
  124. d33 = max(d3a, d33);
  125. d32 = min(d32, d33); // 2nd smallest now not in d33
  126. float3 da = min(d11, d21);
  127. d21 = max(d11, d21);
  128. d11 = min(da, d31); // Smallest now in d11
  129. d31 = max(da, d31); // 2nd smallest now not in d31
  130. d11.xy = (d11.x < d11.y) ? d11.xy : d11.yx;
  131. d11.xz = (d11.x < d11.z) ? d11.xz : d11.zx; // d11.x now smallest
  132. d12 = min(d12, d21); // 2nd smallest now not in d21
  133. d12 = min(d12, d22); // nor in d22
  134. d12 = min(d12, d31); // nor in d31
  135. d12 = min(d12, d32); // nor in d32
  136. d11.yz = min(d11.yz, d12.xy); // nor in d12.yz
  137. d11.y = min(d11.y, d12.z); // Only two more to go
  138. d11.y = min(d11.y, d11.z); // Done! (Phew!)
  139. return sqrt(d11.xy); // F1, F2
  140. }
  141. }
  142. }