Advertisement
Guest User

Untitled

a guest
May 23rd, 2022
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Shader "Grass/GrassShader"
  2. {
  3.     Properties
  4.     {
  5.         _MainTex ("Texture", 2D) = "white" {}
  6.         _Color ("Color", Color) = (1, 1, 1, 1)
  7.  
  8.         [Space]
  9.  
  10.         _WindDirection ("Wind Direction", Vector) = (1, 0, 0, 0)
  11.         _WindSpeed ("Wind Speed", float) = 8
  12.         _WindDensity ("Wind Density", float) = 0.1
  13.         _WindStrength ("Wind Strength", float) = 1
  14.  
  15.         [Space]
  16.  
  17.         _MaxDistance ("Radius", float) = 0.5
  18.         _Falloff ("Falloff", float) = 0.5
  19.         _PushAwayStrength ("Push Away Strength", float) = 0.5
  20.         _PushDownStrength ("Push Down Strength", float) = 0.5
  21.     }
  22.     SubShader
  23.     {
  24.         Tags {
  25.             "Queue" = "Transparent"
  26.             "IgnoreProjectors" = "True"
  27.             "RenderType" = "Transparent" }    
  28.  
  29.         Blend SrcAlpha OneMinusSrcAlpha
  30.         ZWrite Off
  31.         Cull Off
  32.  
  33.         Pass
  34.         {
  35.             CGPROGRAM
  36.  
  37.             #include "UnityCG.cginc"
  38.  
  39.             #pragma target 2.5
  40.             #pragma vertex vert
  41.             #pragma fragment frag
  42.  
  43.             sampler2D _MainTex;
  44.             float4 _MainTex_ST;
  45.             fixed4 _Color;
  46.  
  47.             float3 _WindDirection;
  48.             float _WindSpeed;
  49.             float _WindDensity;
  50.             float _WindStrength;
  51.  
  52.             int _TramplesCount;
  53.             float4 _TramplePositions[64];
  54.             float _TramplesStrength[64];
  55.             float _MaxDistance;
  56.             float _Falloff;
  57.             float _PushAwayStrength;
  58.             float _PushDownStrength;
  59.  
  60.  
  61.             struct meshData
  62.             {
  63.                 float4 vertex : POSITION;
  64.                 float2 uv : TEXCOORD0;
  65.             };
  66.  
  67.             struct vertexOut
  68.             {
  69.                 float4 pos : SV_POSITION;
  70.                 float2 uv : TEXCOORD0;
  71.             };
  72.  
  73.  
  74.             float2 GradientNoiseDir(float2 p)
  75.             {
  76.                 p = p % 289;
  77.  
  78.                 float x = float(34 * p.x + 1) * p.x % 289 + p.y;
  79.                 x = (34 * x + 1) * x % 289;
  80.                 x = frac(x / 41) * 2 - 1;
  81.  
  82.                 return normalize(float2(x - floor(x + 0.5), abs(x) - 0.5));
  83.             }
  84.  
  85.             float GradientNoise(float2 uv, float scale)
  86.             {
  87.                 float2 p = uv * scale;
  88.                 float2 ip = floor(p);
  89.                 float2 fp = frac(p);
  90.  
  91.                 float d00 = dot(GradientNoiseDir(ip), fp);
  92.                 float d01 = dot(GradientNoiseDir(ip + float2(0, 1)), fp - float2(0, 1));
  93.                 float d10 = dot(GradientNoiseDir(ip + float2(1, 0)), fp - float2(1, 0));
  94.                 float d11 = dot(GradientNoiseDir(ip + float2(1, 1)), fp - float2(1, 1));
  95.  
  96.                 fp = fp * fp * fp * (fp * (fp * 6 - 15) + 10);
  97.  
  98.                 return lerp(lerp(d00, d01, fp.y), lerp(d10, d11, fp.y), fp.x) + 0.5;
  99.             }
  100.  
  101.             float3 CalculteWindOffset_WS(float3 worldPos)
  102.             {
  103.                 float2 noiseUV = worldPos + _WindSpeed * _Time;
  104.                 float noise = (GradientNoise(noiseUV, _WindDensity) - 0.5) * _WindStrength;
  105.  
  106.                 float3 offset = normalize(_WindDirection).xyz * noise;
  107.                 return offset;
  108.             }
  109.  
  110.             float3 CalculateTrampleOffset_WS(float3 worldPos)
  111.             {
  112.                 float maxStrength = 0;
  113.                 float3 maxDistanceVector = worldPos;
  114.  
  115.                 for (int i = 0; i < _TramplesCount; i++)
  116.                 {
  117.                     float3 distanceVector = worldPos - _TramplePositions[i];
  118.  
  119.                     float distance = length(distanceVector);
  120.                     float strength = (1 - pow(saturate(distance / _MaxDistance), _Falloff)) * _TramplesStrength[i];
  121.  
  122.                     distanceVector.y = 0;
  123.  
  124.                     int c1 = maxStrength > strength;
  125.                     int c2 = !c1;
  126.  
  127.                     maxStrength = max(maxStrength, strength);
  128.                     maxDistanceVector = maxDistanceVector * c1 + distanceVector * c2;
  129.                 }
  130.                
  131.                 float3 pushAwayOffset = normalize(maxDistanceVector) * _PushAwayStrength * maxStrength;
  132.                 float3 pushDownOffset = float3(0, -1, 0) * _PushDownStrength * maxStrength;
  133.  
  134.                 return (pushAwayOffset + pushDownOffset);
  135.             }
  136.  
  137.  
  138.             vertexOut vert (meshData v)
  139.             {
  140.                 vertexOut o;
  141.                
  142.                 float4 localPos = v.vertex;
  143.  
  144.                 if (v.uv.y > 0)
  145.                 {
  146.                     float3 worldPos = mul(unity_ObjectToWorld, v.vertex);
  147.  
  148.                     float3 windOffset = CalculteWindOffset_WS(worldPos);
  149.                     worldPos += windOffset;
  150.  
  151.                     float3 trampleOffset = CalculateTrampleOffset_WS(worldPos);
  152.                     worldPos += trampleOffset;
  153.  
  154.                     localPos = mul(unity_WorldToObject, float4(worldPos.xyz, 1));
  155.                 }
  156.  
  157.                 o.pos = UnityObjectToClipPos(localPos);
  158.                 o.uv = TRANSFORM_TEX(v.uv, _MainTex);
  159.  
  160.                 return o;
  161.             }
  162.  
  163.             fixed4 frag (vertexOut i) : SV_Target
  164.             {
  165.                 fixed4 col = tex2D(_MainTex, i.uv) * _Color;
  166.  
  167.                 return col;
  168.             }
  169.  
  170.             ENDCG
  171.         }
  172.     }
  173. }
  174.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement