Preview_VoronoiNode.shader 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. Shader "Hidden/VoronoiNode"
  2. {
  3. Properties
  4. {
  5. _A("_RGB", 2D) = "white" {}
  6. _B("_RGB", 2D) = "white" {}
  7. _C("_RGB", 2D) = "white" {}
  8. _D ("_RGB", 2D) = "white" {}
  9. _UseTileScale("_UseTileScale", Float) = 0
  10. _TileScale ("_TileScale", Int) = 1
  11. _MinkowskiPower("_MinkowskiPower", Float) = 0
  12. _DistFunc("_DistFunc", Int) = 0
  13. _MethodType("_MethodType", Int) = 0
  14. _SearchQuality("_SearchQuality", Int) = 1
  15. _Octaves("_Octaves", Int) = 1
  16. _UseSmoothness("_UseSmoothness", Int ) = 0
  17. }
  18. SubShader
  19. {
  20. Tags { "RenderType"="Opaque" }
  21. CGINCLUDE
  22. sampler2D _A;
  23. sampler2D _B;
  24. sampler2D _C;
  25. sampler2D _D;
  26. float _UseTileScale = 0;
  27. int _TileScale = 1;
  28. float _MinkowskiPower = 1;
  29. int _DistFunc = 0;
  30. int _MethodType = 0;
  31. int _SearchQuality = 0;
  32. int _Octaves = 1;
  33. int _PreviewID = 0;
  34. int _UseSmoothness = 0;
  35. int _CustomUVs;
  36. float2 VoronoiHash( float2 p )
  37. {
  38. p = lerp( p, p - _TileScale * floor (p / _TileScale), _UseTileScale );
  39. p = float2(dot (p, float2(127.1, 311.7)), dot (p, float2(269.5, 183.3)));
  40. return frac (sin (p) *43758.5453);
  41. }
  42. float Voronoi( float2 v, float time, inout float2 id, inout float2 mr, float smoothness )
  43. {
  44. float2 n = floor(v);
  45. float2 f = frac(v);
  46. float F1 = 8.0;
  47. float F2 = 8.0;
  48. float2 mg = 0;
  49. for (int j = -_SearchQuality; j <= _SearchQuality; j++)
  50. {
  51. for (int i = -_SearchQuality; i <= _SearchQuality; i++)
  52. {
  53. float2 g = float2(i, j);
  54. float2 o = VoronoiHash (n + g);
  55. o = (sin (time + o * 6.2831) * 0.5 + 0.5); float2 r = f - g - o;
  56. float d = 0;
  57. //Euclidean^2
  58. if (_DistFunc == 0)
  59. {
  60. d = 0.5 * dot (r, r);
  61. }
  62. //Euclidean
  63. else if (_DistFunc == 1)
  64. {
  65. d = 0.707 * sqrt (dot (r, r));
  66. }
  67. //Manhattan
  68. else if (_DistFunc == 2)
  69. {
  70. d = 0.5 * (abs (r.x) + abs (r.y));
  71. }
  72. //Chebyshev
  73. else if (_DistFunc == 3)
  74. {
  75. d = max (abs (r.x), abs (r.y));
  76. }
  77. //Minkowski
  78. else if (_DistFunc == 4)
  79. {
  80. d = (1 / pow(2, 1 / _MinkowskiPower)) * pow( ( pow( abs( r.x ), _MinkowskiPower) + pow( abs( r.y ), _MinkowskiPower) ), (1 / _MinkowskiPower));
  81. }
  82. if (_MethodType == 0 && _UseSmoothness == 1)
  83. {
  84. float h = smoothstep (0.0, 1.0, 0.5 + 0.5 * (F1 - d) / smoothness);
  85. F1 = lerp (F1, d, h) - smoothness * h * (1.0 - h);
  86. mg = g; mr = r; id = o;
  87. }
  88. else
  89. {
  90. if (d < F1)
  91. {
  92. F2 = F1;
  93. F1 = d; mg = g; mr = r; id = o;
  94. }
  95. else if (d < F2)
  96. {
  97. F2 = d;
  98. }
  99. }
  100. }
  101. }
  102. //Cells
  103. if(_MethodType == 0)
  104. {
  105. return F1;
  106. }
  107. //Crystal
  108. else if (_MethodType == 1)
  109. {
  110. return F2;
  111. }
  112. //Glass
  113. else if (_MethodType == 2)
  114. {
  115. return F2 - F1;
  116. }
  117. //Caustic
  118. else if (_MethodType == 3)
  119. {
  120. return (F2 + F1) * 0.5;
  121. }
  122. //Distance
  123. else if (_MethodType == 4)
  124. {
  125. F1 = 8.0;
  126. for (int j = -2; j <= 2; j++)
  127. {
  128. for (int i = -2; i <= 2; i++)
  129. {
  130. float2 g = mg + float2(i, j);
  131. float2 o = VoronoiHash (n + g);
  132. o = ( sin (time + o * 6.2831) * 0.5 + 0.5);
  133. float2 r = f - g - o;
  134. float d = dot (0.5 * (mr + r), normalize (r - mr));
  135. F1 = min (F1, d);
  136. }
  137. }
  138. return F1;
  139. }
  140. else
  141. return F1;
  142. }
  143. ENDCG
  144. Pass // Voronoi - Unity
  145. {
  146. CGPROGRAM
  147. #include "UnityCG.cginc"
  148. #include "Preview.cginc"
  149. #pragma vertex vert_img
  150. #pragma fragment frag
  151. inline float2 UnityVoronoiRandomVector (float2 UV, float offset)
  152. {
  153. float2x2 m = float2x2(15.27, 47.63, 99.41, 89.98);
  154. UV = frac (sin (mul (UV, m)) * 46839.32);
  155. return float2(sin (UV.y* +offset) * 0.5 + 0.5, cos (UV.x* offset) * 0.5 + 0.5);
  156. }
  157. //x - Out y - Cells
  158. float3 UnityVoronoi (float2 UV, float AngleOffset, float CellDensity, inout float2 mr)
  159. {
  160. float2 g = floor (UV * CellDensity);
  161. float2 f = frac (UV * CellDensity);
  162. float t = 8.0;
  163. float3 res = float3(8.0, 0.0, 0.0);
  164. for (int y = -1; y <= 1; y++)
  165. {
  166. for (int x = -1; x <= 1; x++)
  167. {
  168. float2 lattice = float2(x, y);
  169. float2 offset = UnityVoronoiRandomVector (lattice + g, AngleOffset);
  170. float d = distance (lattice + offset, f);
  171. if (d < res.x)
  172. {
  173. mr = f - lattice - offset;
  174. res = float3(d, offset.x, offset.y);
  175. }
  176. }
  177. }
  178. return res;
  179. }
  180. float4 frag (v2f_img i) : SV_Target
  181. {
  182. float2 uvValue = i.uv;
  183. if (_CustomUVs == 1)
  184. uvValue = tex2D(_A, i.uv).rg;
  185. float angleOffset = tex2D(_B, i.uv).r;
  186. float cellDensity = tex2D(_C, i.uv).r;
  187. float2 uv = 0;
  188. float3 voronoiVal = UnityVoronoi( uvValue, angleOffset , cellDensity, uv );
  189. if( _PreviewID == 2)
  190. return float4( uv, 0, 1 );
  191. else if( _PreviewID == 1)
  192. return float4( voronoiVal.yz, 0, 1 );
  193. else
  194. return float4( voronoiVal.xxx, 1);
  195. }
  196. ENDCG
  197. }
  198. Pass // Voronoi - ASE
  199. {
  200. CGPROGRAM
  201. #include "UnityCG.cginc"
  202. #include "Preview.cginc"
  203. #pragma vertex vert_img
  204. #pragma fragment frag
  205. float4 frag (v2f_img i) : SV_Target
  206. {
  207. float2 uvValue = i.uv;
  208. if (_CustomUVs == 1)
  209. uvValue = tex2D(_A, i.uv).rg;
  210. float time = tex2D (_B, i.uv).r;
  211. float scale = tex2D (_C, i.uv).r;
  212. float smoothness = tex2D (_D, i.uv).r;
  213. float2 id = 0;
  214. float2 uv = 0;
  215. float voronoiVal = Voronoi( uvValue*scale,time, id, uv, smoothness );
  216. if (_Octaves == 1)
  217. {
  218. if( _PreviewID == 2)
  219. return float4( uv, 0, 1 );
  220. else if( _PreviewID == 1)
  221. return float4( id, 0, 1 );
  222. else
  223. return float4(voronoiVal.xxx, 1);
  224. }
  225. else
  226. {
  227. float fade = 0.5;
  228. float voroi = 0;
  229. float rest = 0;
  230. for (int it = 0; it < _Octaves; it++)
  231. {
  232. voroi += fade * Voronoi( uvValue*scale, time, id, uv, smoothness);
  233. rest += fade;
  234. uvValue *= 2;
  235. fade *= 0.5;
  236. }
  237. voroi /= rest;
  238. if( _PreviewID == 2)
  239. return float4( uv, 0, 1 );
  240. else if( _PreviewID == 1)
  241. return float4( id, 0, 1 );
  242. else
  243. return float4(voroi.xxx, 1);
  244. }
  245. }
  246. ENDCG
  247. }
  248. }
  249. }