Advertisement
tonynogo

Demo 74 - Perlin noise

Jul 6th, 2017
9,012
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Shader "Custom/Noise/Perlin"
  2. {
  3.     Properties
  4.     {
  5.         _GridSize ("GridSize", float) = 1.0
  6.         _X ("Seed X", float) = 1.0
  7.         _Y ("Seed Y", float) = 1.0
  8.     }
  9.  
  10.     SubShader
  11.     {
  12.         Tags { "RenderType"="Opaque" }
  13.  
  14.         Pass
  15.         {
  16.             CGPROGRAM
  17.             #pragma vertex vert_img
  18.             #pragma fragment frag
  19.             #include "UnityCG.cginc"
  20.  
  21.             float4 permute(float4 x)
  22.             {
  23.                 return fmod(34.0 * pow(x, 2) + x, 289.0);
  24.             }
  25.  
  26.             float2 fade(float2 t) {
  27.                 return 6.0 * pow(t, 5.0) - 15.0 * pow(t, 4.0) + 10.0 * pow(t, 3.0);
  28.             }
  29.  
  30.             float4 taylorInvSqrt(float4 r) {
  31.                 return 1.79284291400159 - 0.85373472095314 * r;
  32.             }
  33.  
  34.             #define DIV_289 0.00346020761245674740484429065744f
  35.  
  36.             float mod289(float x) {
  37.                 return x - floor(x * DIV_289) * 289.0;
  38.             }
  39.  
  40.             float PerlinNoise2D(float2 P)
  41.             {
  42.                   float4 Pi = floor(P.xyxy) + float4(0.0, 0.0, 1.0, 1.0);
  43.                   float4 Pf = frac (P.xyxy) - float4(0.0, 0.0, 1.0, 1.0);
  44.  
  45.                   float4 ix = Pi.xzxz;
  46.                   float4 iy = Pi.yyww;
  47.                   float4 fx = Pf.xzxz;
  48.                   float4 fy = Pf.yyww;
  49.  
  50.                   float4 i = permute(permute(ix) + iy);
  51.  
  52.                   float4 gx = frac(i / 41.0) * 2.0 - 1.0 ;
  53.                   float4 gy = abs(gx) - 0.5 ;
  54.                   float4 tx = floor(gx + 0.5);
  55.                   gx = gx - tx;
  56.  
  57.                   float2 g00 = float2(gx.x,gy.x);
  58.                   float2 g10 = float2(gx.y,gy.y);
  59.                   float2 g01 = float2(gx.z,gy.z);
  60.                   float2 g11 = float2(gx.w,gy.w);
  61.  
  62.                   float4 norm = taylorInvSqrt(float4(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11)));
  63.                   g00 *= norm.x;
  64.                   g01 *= norm.y;
  65.                   g10 *= norm.z;
  66.                   g11 *= norm.w;
  67.  
  68.                   float n00 = dot(g00, float2(fx.x, fy.x));
  69.                   float n10 = dot(g10, float2(fx.y, fy.y));
  70.                   float n01 = dot(g01, float2(fx.z, fy.z));
  71.                   float n11 = dot(g11, float2(fx.w, fy.w));
  72.  
  73.                   float2 fade_xy = fade(Pf.xy);
  74.                   float2 n_x = lerp(float2(n00, n01), float2(n10, n11), fade_xy.x);
  75.                   float n_xy = lerp(n_x.x, n_x.y, fade_xy.y);
  76.                   return 2.3 * n_xy;
  77.             }
  78.  
  79.             float _GridSize;
  80.             float _X;
  81.             float _Y;
  82.  
  83.             fixed4 frag (v2f_img i) : SV_Target
  84.             {
  85.                 i.uv *= _GridSize;
  86.                 i.uv += float2(_X, _Y);
  87.                 float ns = PerlinNoise2D(i.uv) / 2 + 0.5f;
  88.                 return float4(ns, ns, ns, 1.0f);
  89.             }
  90.             ENDCG
  91.         }
  92.     }
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement