Preview_NoiseGeneratorNode.shader 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. Shader "Hidden/NoiseGeneratorNode"
  2. {
  3. Properties
  4. {
  5. _A ("_RGB", 2D) = "white" {}
  6. _B ("_RGB", 2D) = "white" {}
  7. _To01Range ("_To01Range", Float) = 0
  8. }
  9. SubShader
  10. {
  11. CGINCLUDE
  12. sampler2D _A;
  13. sampler2D _B;
  14. float _To01Range;
  15. ENDCG
  16. Pass //Simplex2D
  17. {
  18. CGPROGRAM
  19. #include "UnityCG.cginc"
  20. #include "Preview.cginc"
  21. #pragma vertex vert_img
  22. #pragma fragment frag
  23. float3 mod2D289 ( float3 x ) { return x - floor ( x * ( 1.0 / 289.0 ) ) * 289.0; }
  24. float2 mod2D289 ( float2 x ) { return x - floor ( x * ( 1.0 / 289.0 ) ) * 289.0; }
  25. float3 permute ( float3 x ) { return mod2D289 ( ( ( x * 34.0 ) + 1.0 ) * x ); }
  26. float snoise ( float2 v )
  27. {
  28. const float4 C = float4( 0.211324865405187, 0.366025403784439, -0.577350269189626, 0.024390243902439 );
  29. float2 i = floor ( v + dot ( v, C.yy ) );
  30. float2 x0 = v - i + dot ( i, C.xx );
  31. float2 i1;
  32. i1 = ( x0.x > x0.y ) ? float2( 1.0, 0.0 ) : float2( 0.0, 1.0 );
  33. float4 x12 = x0.xyxy + C.xxzz;
  34. x12.xy -= i1;
  35. i = mod2D289 ( i );
  36. float3 p = permute ( permute ( i.y + float3( 0.0, i1.y, 1.0 ) ) + i.x + float3( 0.0, i1.x, 1.0 ) );
  37. float3 m = max ( 0.5 - float3( dot ( x0, x0 ), dot ( x12.xy, x12.xy ), dot ( x12.zw, x12.zw ) ), 0.0 );
  38. m = m * m;
  39. m = m * m;
  40. float3 x = 2.0 * frac ( p * C.www ) - 1.0;
  41. float3 h = abs ( x ) - 0.5;
  42. float3 ox = floor ( x + 0.5 );
  43. float3 a0 = x - ox;
  44. m *= 1.79284291400159 - 0.85373472095314 * ( a0 * a0 + h * h );
  45. float3 g;
  46. g.x = a0.x * x0.x + h.x * x0.y;
  47. g.yz = a0.yz * x12.xz + h.yz * x12.yw;
  48. return 130.0 * dot ( m, g );
  49. }
  50. float4 frag(v2f_img i) : SV_Target
  51. {
  52. float2 size = tex2D( _A, i.uv ).rg;
  53. float scale = tex2D (_B, i.uv).r;
  54. float noiseVal = snoise ( size * scale );
  55. noiseVal = (_To01Range > 0) ? noiseVal * 0.5 + 0.5 : noiseVal;
  56. return float4( noiseVal.xxx, 1);
  57. }
  58. ENDCG
  59. }
  60. Pass //Simplex3D
  61. {
  62. CGPROGRAM
  63. #include "UnityCG.cginc"
  64. #include "Preview.cginc"
  65. #pragma vertex vert_img
  66. #pragma fragment frag
  67. float3 mod3D289 ( float3 x ) { return x - floor ( x / 289.0 ) * 289.0; }
  68. float4 mod3D289 ( float4 x ) { return x - floor ( x / 289.0 ) * 289.0; }
  69. float4 permute ( float4 x ) { return mod3D289 ( ( x * 34.0 + 1.0 ) * x ); }
  70. float4 taylorInvSqrt ( float4 r ) { return 1.79284291400159 - r * 0.85373472095314; }
  71. float snoise ( float3 v )
  72. {
  73. const float2 C = float2( 1.0 / 6.0, 1.0 / 3.0 );
  74. float3 i = floor ( v + dot ( v, C.yyy ) );
  75. float3 x0 = v - i + dot ( i, C.xxx );
  76. float3 g = step ( x0.yzx, x0.xyz );
  77. float3 l = 1.0 - g;
  78. float3 i1 = min ( g.xyz, l.zxy );
  79. float3 i2 = max ( g.xyz, l.zxy );
  80. float3 x1 = x0 - i1 + C.xxx;
  81. float3 x2 = x0 - i2 + C.yyy;
  82. float3 x3 = x0 - 0.5;
  83. i = mod3D289 ( i );
  84. float4 p = permute ( permute ( permute ( i.z + float4( 0.0, i1.z, i2.z, 1.0 ) ) + i.y + float4( 0.0, i1.y, i2.y, 1.0 ) ) + i.x + float4( 0.0, i1.x, i2.x, 1.0 ) );
  85. float4 j = p - 49.0 * floor ( p / 49.0 ); // mod(p,7*7)
  86. float4 x_ = floor ( j / 7.0 );
  87. float4 y_ = floor ( j - 7.0 * x_ ); // mod(j,N)
  88. float4 x = ( x_ * 2.0 + 0.5 ) / 7.0 - 1.0;
  89. float4 y = ( y_ * 2.0 + 0.5 ) / 7.0 - 1.0;
  90. float4 h = 1.0 - abs ( x ) - abs ( y );
  91. float4 b0 = float4( x.xy, y.xy );
  92. float4 b1 = float4( x.zw, y.zw );
  93. float4 s0 = floor ( b0 ) * 2.0 + 1.0;
  94. float4 s1 = floor ( b1 ) * 2.0 + 1.0;
  95. float4 sh = -step ( h, 0.0 );
  96. float4 a0 = b0.xzyw + s0.xzyw * sh.xxyy;
  97. float4 a1 = b1.xzyw + s1.xzyw * sh.zzww;
  98. float3 g0 = float3( a0.xy, h.x );
  99. float3 g1 = float3( a0.zw, h.y );
  100. float3 g2 = float3( a1.xy, h.z );
  101. float3 g3 = float3( a1.zw, h.w );
  102. float4 norm = taylorInvSqrt ( float4( dot ( g0, g0 ), dot ( g1, g1 ), dot ( g2, g2 ), dot ( g3, g3 ) ) );
  103. g0 *= norm.x;
  104. g1 *= norm.y;
  105. g2 *= norm.z;
  106. g3 *= norm.w;
  107. float4 m = max ( 0.6 - float4( dot ( x0, x0 ), dot ( x1, x1 ), dot ( x2, x2 ), dot ( x3, x3 ) ), 0.0 );
  108. m = m* m;
  109. m = m* m;
  110. float4 px = float4( dot ( x0, g0 ), dot ( x1, g1 ), dot ( x2, g2 ), dot ( x3, g3 ) );
  111. return 42.0 * dot ( m, px );
  112. }
  113. float4 frag ( v2f_img i ) : SV_Target
  114. {
  115. float3 size = tex2D ( _A, i.uv ).rgb;
  116. float scale = tex2D (_B, i.uv).r;
  117. float noiseVal = snoise ( size * scale );
  118. noiseVal = (_To01Range > 0) ? noiseVal * 0.5 + 0.5 : noiseVal;
  119. return float4( noiseVal.xxx, 1 );
  120. }
  121. ENDCG
  122. }
  123. Pass // Gradient - Shader Toy
  124. {
  125. CGPROGRAM
  126. #include "UnityCG.cginc"
  127. #include "Preview.cginc"
  128. #pragma vertex vert_img
  129. #pragma fragment frag
  130. //https://www.shadertoy.com/view/XdXGW8
  131. float2 GradientNoiseDir (float2 x)
  132. {
  133. const float2 k = float2(0.3183099, 0.3678794);
  134. x = x * k + k.yx;
  135. return -1.0 + 2.0 * frac (16.0 * k * frac (x.x * x.y * (x.x + x.y)));
  136. }
  137. float GradientNoise (float2 UV, float Scale)
  138. {
  139. float2 p = UV * Scale;
  140. float2 i = floor (p);
  141. float2 f = frac (p);
  142. float2 u = f * f * (3.0 - 2.0 * f);
  143. return lerp (lerp (dot (GradientNoiseDir (i + float2(0.0, 0.0)), f - float2(0.0, 0.0)),
  144. dot (GradientNoiseDir (i + float2(1.0, 0.0)), f - float2(1.0, 0.0)), u.x),
  145. lerp (dot (GradientNoiseDir (i + float2(0.0, 1.0)), f - float2(0.0, 1.0)),
  146. dot (GradientNoiseDir (i + float2(1.0, 1.0)), f - float2(1.0, 1.0)), u.x), u.y);
  147. }
  148. float4 frag (v2f_img i) : SV_Target
  149. {
  150. float3 size = tex2D (_A, i.uv).rgb;
  151. float scale = tex2D (_B, i.uv).r;
  152. float noiseVal = GradientNoise (size , scale);
  153. noiseVal = (_To01Range > 0) ? noiseVal * 0.5 + 0.5 : noiseVal;
  154. return float4(noiseVal.xxx, 1);
  155. }
  156. ENDCG
  157. }
  158. Pass // Gradient - Unity
  159. {
  160. CGPROGRAM
  161. #include "UnityCG.cginc"
  162. #include "Preview.cginc"
  163. #pragma vertex vert_img
  164. #pragma fragment frag
  165. float2 UnityGradientNoiseDir (float2 p)
  166. {
  167. p = fmod (p , 289);
  168. float x = fmod ((34 * p.x + 1) * p.x , 289) + p.y;
  169. x = fmod ((34 * x + 1) * x , 289);
  170. x = frac (x / 41) * 2 - 1;
  171. return normalize (float2(x - floor (x + 0.5), abs (x) - 0.5));
  172. }
  173. float UnityGradientNoise (float2 UV, float Scale)
  174. {
  175. float2 p = UV * Scale;
  176. float2 ip = floor (p);
  177. float2 fp = frac (p);
  178. float d00 = dot (UnityGradientNoiseDir (ip), fp);
  179. float d01 = dot (UnityGradientNoiseDir (ip + float2(0, 1)), fp - float2(0, 1));
  180. float d10 = dot (UnityGradientNoiseDir (ip + float2(1, 0)), fp - float2(1, 0));
  181. float d11 = dot (UnityGradientNoiseDir (ip + float2(1, 1)), fp - float2(1, 1));
  182. fp = fp * fp * fp * (fp * (fp * 6 - 15) + 10);
  183. return lerp (lerp (d00, d01, fp.y), lerp (d10, d11, fp.y), fp.x) + 0.5;
  184. }
  185. float4 frag (v2f_img i) : SV_Target
  186. {
  187. float3 size = tex2D (_A, i.uv).rgb;
  188. float scale = tex2D (_B, i.uv).r;
  189. float noiseVal = UnityGradientNoise(size , scale);
  190. noiseVal = (_To01Range > 0) ? noiseVal * 0.5 + 0.5 : noiseVal;
  191. return float4(noiseVal.xxx, 1);
  192. }
  193. ENDCG
  194. }
  195. Pass // Simple
  196. {
  197. CGPROGRAM
  198. #include "UnityCG.cginc"
  199. #include "Preview.cginc"
  200. #pragma vertex vert_img
  201. #pragma fragment frag
  202. inline float noise_randomValue (float2 uv) { return frac(sin(dot(uv, float2(12.9898, 78.233)))*43758.5453); }
  203. inline float noise_interpolate (float a, float b, float t) { return (1.0-t)*a + (t*b); }
  204. inline float valueNoise (float2 uv)
  205. {
  206. float2 i = floor(uv);
  207. float2 f = frac( uv );
  208. f = f* f * (3.0 - 2.0 * f);
  209. uv = abs( frac(uv) - 0.5);
  210. float2 c0 = i + float2( 0.0, 0.0 );
  211. float2 c1 = i + float2( 1.0, 0.0 );
  212. float2 c2 = i + float2( 0.0, 1.0 );
  213. float2 c3 = i + float2( 1.0, 1.0 );
  214. float r0 = noise_randomValue( c0 );
  215. float r1 = noise_randomValue( c1 );
  216. float r2 = noise_randomValue( c2 );
  217. float r3 = noise_randomValue( c3 );
  218. float bottomOfGrid = noise_interpolate( r0, r1, f.x );
  219. float topOfGrid = noise_interpolate( r2, r3, f.x );
  220. float t = noise_interpolate( bottomOfGrid, topOfGrid, f.y );
  221. return t;
  222. }
  223. float SimpleNoise(float2 UV)
  224. {
  225. float t = 0.0;
  226. float freq = pow( 2.0, float( 0 ) );
  227. float amp = pow( 0.5, float( 3 - 0 ) );
  228. t += valueNoise( UV/freq )*amp;
  229. freq = pow(2.0, float(1));
  230. amp = pow(0.5, float(3-1));
  231. t += valueNoise( UV/freq )*amp;
  232. freq = pow(2.0, float(2));
  233. amp = pow(0.5, float(3-2));
  234. t += valueNoise( UV/freq )*amp;
  235. return t;
  236. }
  237. float4 frag (v2f_img i) : SV_Target
  238. {
  239. float3 size = tex2D (_A, i.uv).rgb;
  240. float scale = tex2D (_B, i.uv).r;
  241. float noiseVal = SimpleNoise(size * scale);
  242. noiseVal = (_To01Range == 0) ? noiseVal * 2 - 1 : noiseVal;
  243. return float4(noiseVal.xxx, 1);
  244. }
  245. ENDCG
  246. }
  247. }
  248. }