RaenirSalazar

Untitled

Dec 31st, 2020
891
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.51 KB | None | 0 0
  1. // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
  2.  
  3.  
  4.  
  5. Shader "Noise/ImprovedPerlinNoise2D"
  6. {
  7.     SubShader
  8.     {
  9.         Pass
  10.         {
  11.    
  12.             CGPROGRAM
  13.  
  14.             #pragma vertex vert
  15.             #pragma fragment frag
  16.             #pragma target 3.0
  17.             #include "UnityCG.cginc"
  18.            
  19.             sampler2D _PermTable1D, _Gradient2D;
  20.             float _Frequency, _Lacunarity, _Gain;
  21.             float _NoiseStyle;
  22.            
  23.             struct v2f
  24.             {
  25.                 float4 pos : SV_POSITION;
  26.                 float4 uv : TEXCOORD;
  27.             };
  28.            
  29.             v2f vert (appdata_base v)
  30.             {
  31.                 v2f o;
  32.                 o.pos = UnityObjectToClipPos(v.vertex);
  33.                 o.uv = v.vertex;
  34.                 return o;
  35.             }
  36.            
  37.             float2 fade(float2 t)
  38.             {
  39.                 return t * t * t * (t * (t * 6 - 15) + 10);
  40.             }
  41.            
  42.             float perm(float x)
  43.             {
  44.                 return tex2D(_PermTable1D, float2(x,0)).a;
  45.             }
  46.            
  47.             float grad(float x, float2 p)
  48.             {
  49.                 float2 g = tex2D(_Gradient2D, float2(x*8.0, 0) ).rg *2.0 - 1.0;
  50.                 return dot(g, p);
  51.             }
  52.                        
  53.             float inoise(float2 p)
  54.             {
  55.                 float2 P = fmod(floor(p), 256.0);   // FIND UNIT SQUARE THAT CONTAINS POINT
  56.                 p -= floor(p);                      // FIND RELATIVE X,Y OF POINT IN SQUARE.
  57.                 float2 f = fade(p);                 // COMPUTE FADE CURVES FOR EACH OF X,Y.
  58.            
  59.                 P = P / 256.0;
  60.                 const float one = 1.0 / 256.0;
  61.                
  62.                 // HASH COORDINATES OF THE 4 SQUARE CORNERS
  63.                 float A = perm(P.x) + P.y;
  64.                 float B = perm(P.x + one) + P.y;
  65.              
  66.                 // AND ADD BLENDED RESULTS FROM 4 CORNERS OF SQUARE
  67.                 return lerp( lerp( grad(perm(A    ), p ),  
  68.                                    grad(perm(B    ), p + float2(-1, 0) ), f.x),
  69.                              lerp( grad(perm(A+one    ), p + float2(0, -1) ),
  70.                                    grad(perm(B+one    ), p + float2(-1, -1) ), f.x), f.y);
  71.                                        
  72.             }
  73.            
  74.             // fractal sum, range -1.0 - 1.0
  75.             float fBm(float2 p, int octaves)
  76.             {
  77.                 float freq = _Frequency, amp = 0.5;
  78.                 float sum = 0; 
  79.                 for(int i = 0; i < octaves; i++)
  80.                 {
  81.                     sum += inoise(p * freq) * amp;
  82.                     freq *= _Lacunarity;
  83.                     amp *= _Gain;
  84.                 }
  85.                 return sum;
  86.             }
  87.            
  88.             // fractal abs sum, range 0.0 - 1.0
  89.             float turbulence(float2 p, int octaves)
  90.             {
  91.                 float sum = 0;
  92.                 float freq = _Frequency, amp = 1.0;
  93.                 for(int i = 0; i < octaves; i++)
  94.                 {
  95.                     sum += abs(inoise(p*freq))*amp;
  96.                     freq *= _Lacunarity;
  97.                     amp *= _Gain;
  98.                 }
  99.                 return sum;
  100.             }
  101.            
  102.             // Ridged multifractal, range 0.0 - 1.0
  103.             // See "Texturing & Modeling, A Procedural Approach", Chapter 12
  104.             float ridge(float h, float offset)
  105.             {
  106.                 h = abs(h);
  107.                 h = offset - h;
  108.                 h = h * h;
  109.                 return h;
  110.             }
  111.            
  112.             float ridgedmf(float2 p, int octaves, float offset)
  113.             {
  114.                 float sum = 0;
  115.                 float freq = _Frequency, amp = 0.5;
  116.                 float prev = 1.0;
  117.                 for(int i = 0; i < octaves; i++)
  118.                 {
  119.                     float n = ridge(inoise(p*freq), offset);
  120.                     sum += n*amp*prev;
  121.                     prev = n;
  122.                     freq *= _Lacunarity;
  123.                     amp *= _Gain;
  124.                 }
  125.                 return sum;
  126.             }
  127.            
  128.             half4 frag (v2f i) : COLOR
  129.             {
  130.                 float n = 0;
  131.  
  132.                 //I reconmend not to actually use the conditional statment.
  133.                 //Just pick one stlye or have a seperate shader for each.
  134.                 if (_NoiseStyle == 0)
  135.                 {
  136.                     n = fBm(i.uv.xz, 4);
  137.                 }
  138.                 else if (_NoiseStyle == 1)
  139.                 {
  140.                     n = turbulence(i.uv.xz, 4);
  141.                 }
  142.                 else if (_NoiseStyle == 2)
  143.                 {
  144.                     n = ridgedmf(i.uv.xz, 4, 1.0);
  145.                 }
  146.            
  147.                 return half4(n,n,n,1);
  148.             }
  149.            
  150.             ENDCG
  151.    
  152.         }
  153.     }
  154.     Fallback "VertexLit"
  155. }
  156.  
  157.  
Advertisement
Add Comment
Please, Sign In to add comment