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.

125 lines
4.0 KiB

  1. Shader "Hidden/NoiseGeneratorNode"
  2. {
  3. Properties
  4. {
  5. _A ("_RGB", 2D) = "white" {}
  6. }
  7. SubShader
  8. {
  9. Pass //Simplex2D
  10. {
  11. CGPROGRAM
  12. #include "UnityCG.cginc"
  13. #pragma vertex vert_img
  14. #pragma fragment frag
  15. sampler2D _A;
  16. float3 mod2D289 ( float3 x ) { return x - floor ( x * ( 1.0 / 289.0 ) ) * 289.0; }
  17. float2 mod2D289 ( float2 x ) { return x - floor ( x * ( 1.0 / 289.0 ) ) * 289.0; }
  18. float3 permute ( float3 x ) { return mod2D289 ( ( ( x * 34.0 ) + 1.0 ) * x ); }
  19. float snoise ( float2 v )
  20. {
  21. const float4 C = float4( 0.211324865405187, 0.366025403784439, -0.577350269189626, 0.024390243902439 );
  22. float2 i = floor ( v + dot ( v, C.yy ) );
  23. float2 x0 = v - i + dot ( i, C.xx );
  24. float2 i1;
  25. i1 = ( x0.x > x0.y ) ? float2( 1.0, 0.0 ) : float2( 0.0, 1.0 );
  26. float4 x12 = x0.xyxy + C.xxzz;
  27. x12.xy -= i1;
  28. i = mod2D289 ( i );
  29. float3 p = permute ( permute ( i.y + float3( 0.0, i1.y, 1.0 ) ) + i.x + float3( 0.0, i1.x, 1.0 ) );
  30. float3 m = max ( 0.5 - float3( dot ( x0, x0 ), dot ( x12.xy, x12.xy ), dot ( x12.zw, x12.zw ) ), 0.0 );
  31. m = m * m;
  32. m = m * m;
  33. float3 x = 2.0 * frac ( p * C.www ) - 1.0;
  34. float3 h = abs ( x ) - 0.5;
  35. float3 ox = floor ( x + 0.5 );
  36. float3 a0 = x - ox;
  37. m *= 1.79284291400159 - 0.85373472095314 * ( a0 * a0 + h * h );
  38. float3 g;
  39. g.x = a0.x * x0.x + h.x * x0.y;
  40. g.yz = a0.yz * x12.xz + h.yz * x12.yw;
  41. return 130.0 * dot ( m, g );
  42. }
  43. float4 frag(v2f_img i) : SV_Target
  44. {
  45. float2 size = tex2D( _A, i.uv ).rg;
  46. float noiseVal = snoise ( size );
  47. return float4( noiseVal.xxx, 1);
  48. }
  49. ENDCG
  50. }
  51. Pass //Simplex3D
  52. {
  53. CGPROGRAM
  54. #include "UnityCG.cginc"
  55. #pragma vertex vert_img
  56. #pragma fragment frag
  57. sampler2D _A;
  58. float3 mod3D289 ( float3 x ) { return x - floor ( x / 289.0 ) * 289.0; }
  59. float4 mod3D289 ( float4 x ) { return x - floor ( x / 289.0 ) * 289.0; }
  60. float4 permute ( float4 x ) { return mod3D289 ( ( x * 34.0 + 1.0 ) * x ); }
  61. float4 taylorInvSqrt ( float4 r ) { return 1.79284291400159 - r * 0.85373472095314; }
  62. float snoise ( float3 v )
  63. {
  64. const float2 C = float2( 1.0 / 6.0, 1.0 / 3.0 );
  65. float3 i = floor ( v + dot ( v, C.yyy ) );
  66. float3 x0 = v - i + dot ( i, C.xxx );
  67. float3 g = step ( x0.yzx, x0.xyz );
  68. float3 l = 1.0 - g;
  69. float3 i1 = min ( g.xyz, l.zxy );
  70. float3 i2 = max ( g.xyz, l.zxy );
  71. float3 x1 = x0 - i1 + C.xxx;
  72. float3 x2 = x0 - i2 + C.yyy;
  73. float3 x3 = x0 - 0.5;
  74. i = mod3D289 ( i );
  75. 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 ) );
  76. float4 j = p - 49.0 * floor ( p / 49.0 ); // mod(p,7*7)
  77. float4 x_ = floor ( j / 7.0 );
  78. float4 y_ = floor ( j - 7.0 * x_ ); // mod(j,N)
  79. float4 x = ( x_ * 2.0 + 0.5 ) / 7.0 - 1.0;
  80. float4 y = ( y_ * 2.0 + 0.5 ) / 7.0 - 1.0;
  81. float4 h = 1.0 - abs ( x ) - abs ( y );
  82. float4 b0 = float4( x.xy, y.xy );
  83. float4 b1 = float4( x.zw, y.zw );
  84. float4 s0 = floor ( b0 ) * 2.0 + 1.0;
  85. float4 s1 = floor ( b1 ) * 2.0 + 1.0;
  86. float4 sh = -step ( h, 0.0 );
  87. float4 a0 = b0.xzyw + s0.xzyw * sh.xxyy;
  88. float4 a1 = b1.xzyw + s1.xzyw * sh.zzww;
  89. float3 g0 = float3( a0.xy, h.x );
  90. float3 g1 = float3( a0.zw, h.y );
  91. float3 g2 = float3( a1.xy, h.z );
  92. float3 g3 = float3( a1.zw, h.w );
  93. float4 norm = taylorInvSqrt ( float4( dot ( g0, g0 ), dot ( g1, g1 ), dot ( g2, g2 ), dot ( g3, g3 ) ) );
  94. g0 *= norm.x;
  95. g1 *= norm.y;
  96. g2 *= norm.z;
  97. g3 *= norm.w;
  98. float4 m = max ( 0.6 - float4( dot ( x0, x0 ), dot ( x1, x1 ), dot ( x2, x2 ), dot ( x3, x3 ) ), 0.0 );
  99. m = m* m;
  100. m = m* m;
  101. float4 px = float4( dot ( x0, g0 ), dot ( x1, g1 ), dot ( x2, g2 ), dot ( x3, g3 ) );
  102. return 42.0 * dot ( m, px );
  103. }
  104. float4 frag ( v2f_img i ) : SV_Target
  105. {
  106. float3 size = tex2D ( _A, i.uv ).rgb;
  107. float noiseVal = snoise ( size );
  108. return float4( noiseVal.xxx, 1 );
  109. }
  110. ENDCG
  111. }
  112. }
  113. }