Guest User

ScatterDistance.shader

a guest
Nov 30th, 2019
862
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Shader "Toon/Lit Distance Rotated" {
  2.     Properties{
  3.         _Color("Color Primary", Color) = (0.5,0.5,0.5,1)
  4.         _MainTex("Main Texture", 2D) = "white" {}
  5.         _Offset("Offset", Range(0,10)) = 1
  6.         _Bobbing("Bobbing Up&Down", Range(0,10)) = 1
  7.         [Toggle(X_ON)] _X_ON("X axis Offset (Y if False)", Int) = 0
  8.         _AngleY("Angle Y", Range(0,360)) = 10
  9.         _AngleZ("Angle Z", Range(0,360)) = 10
  10.         _Noise("Noise Texture", 2D) = "white" {}
  11.         _Color2("Secondary Color", Color) = (1,1,1,1)
  12.         _SecondTex("Secondary (RGB)", 2D) = "white" {}
  13.         _ScrollSpeed("MoveSpeed", Range(0,20)) = 10
  14.         _NScale("Noise Scale", Range(0, 10)) = 1
  15.         _DisAmount("Noise Texture Opacity", Range(0.01, 1)) = 0.01
  16.         _Radius("Radius", Range(0, 10)) = 0
  17.         _DisLineWidth("Line Width", Range(0, 2)) = 0
  18.         _DisLineColor("Line Tint", Color) = (1,1,1,1)
  19.  
  20.     }
  21.  
  22.         SubShader{
  23.             Tags { "RenderType" = "Opaque"  }
  24.             LOD 200
  25.  
  26.         CGPROGRAM
  27.         #pragma surface surf ToonRamp vertex:vert addshadow // addshadow applies shadow after vertex animation
  28.  
  29.         // custom lighting function based
  30.         // on angle between light direction and normal
  31.         #pragma lighting ToonRamp exclude_path:prepass
  32.         #pragma multi_compile_instancing
  33.          #pragma shader_feature X_ON
  34.     inline half4 LightingToonRamp(SurfaceOutput s, half3 lightDir, half atten)
  35.             {
  36.                 #ifndef USING_DIRECTIONAL_LIGHT
  37.                 lightDir = normalize(lightDir);
  38.                 #endif
  39.  
  40.                 float d = dot(s.Normal, lightDir);
  41.                 float3 ramp = smoothstep(0, d , d) + 0.5f;
  42.                 half4 c;
  43.                 c.rgb = s.Albedo * _LightColor0.rgb * ramp * (atten * 2);
  44.                 c.a = 0;
  45.                 return c;
  46.             }
  47.  
  48.             // rotation from the unity skybox shader
  49.               float3 RotateAroundYInDegrees(float3 vertex, float degrees)
  50.             {
  51.                 float alpha = degrees * UNITY_PI / 180.0;
  52.                 float sina, cosa;
  53.                 sincos(alpha, sina, cosa);
  54.                 float2x2 m = float2x2(cosa, -sina, sina, cosa);
  55.                 return float3(mul(m, vertex.xz), vertex.y).xzy;
  56.             }
  57.  
  58.               // set up for Z axis
  59.                float3 RotateAroundZInDegrees(float3 vertex, float degrees)
  60.              {
  61.                 float alpha = degrees * UNITY_PI / 180.0;
  62.                 float sina, cosa;
  63.                 sincos(alpha, sina, cosa);
  64.                 float2x2 m = float2x2(cosa, -sina, sina, cosa);
  65.                 return float3(mul(m, vertex.xy), vertex.z).zxy;
  66.              }
  67.  
  68.             sampler2D _MainTex,_Noise,_SecondTex;
  69.             float _Offset;
  70.             float4 _Color, _Color2;
  71.             float _AngleY, _AngleZ;
  72.  
  73.             float _DisAmount, _NScale;
  74.             float _DisLineWidth;
  75.             float4 _DisLineColor;
  76.             float _Radius, _ScrollSpeed, _Bobbing;
  77.  
  78.  
  79.             float3 _PositionMoving; // from script
  80.  
  81.             struct Input {
  82.                 float2 uv_MainTex : TEXCOORD0;
  83.                 float3 worldPos;// built in value to use the world space position
  84.                 float3 worldNormal; // built in value for world normal
  85.             };
  86.  
  87.             UNITY_INSTANCING_BUFFER_START(Props)
  88.             UNITY_DEFINE_INSTANCED_PROP(float, _Moved)
  89.             UNITY_DEFINE_INSTANCED_PROP(float, _RandomOffset)
  90.             UNITY_INSTANCING_BUFFER_END(Props)
  91.  
  92.             void vert(inout appdata_full v)//
  93.             {
  94.                 float awayFromPlayer = 1 - UNITY_ACCESS_INSTANCED_PROP(Props, _Moved);
  95.                 float offsetRandomise = UNITY_ACCESS_INSTANCED_PROP(Props, _RandomOffset) * _Offset;
  96.  
  97.                 // up and down movement
  98.                 v.vertex.y += sin(_Time.y* UNITY_ACCESS_INSTANCED_PROP(Props, _RandomOffset)) * _Bobbing * awayFromPlayer;
  99.  
  100.                 // offset
  101. #if X_ON
  102.                  v.vertex.x += offsetRandomise - UNITY_ACCESS_INSTANCED_PROP(Props, _Moved * offsetRandomise);
  103. #else
  104.                  v.vertex.y += offsetRandomise - UNITY_ACCESS_INSTANCED_PROP(Props, _Moved * offsetRandomise);
  105. #endif
  106.  
  107.  
  108.                  // rotation with randomised angle
  109.                  float angleY = _AngleY * UNITY_ACCESS_INSTANCED_PROP(Props, _RandomOffset);
  110.                  float angleWhileAwayY = angleY * awayFromPlayer;
  111.  
  112.                  float angleZ = _AngleZ * UNITY_ACCESS_INSTANCED_PROP(Props, _RandomOffset);
  113.                  float angleWhileAwayZ = angleZ * awayFromPlayer;
  114.  
  115.                  v.vertex.xyz = RotateAroundYInDegrees(RotateAroundZInDegrees(v.vertex.xyz, -90 + angleWhileAwayZ),90 + angleWhileAwayY);
  116.  
  117.             }
  118.  
  119.              void surf(Input IN, inout SurfaceOutput o) {
  120.                  half4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
  121.                  half4 c2 = tex2D(_SecondTex, IN.uv_MainTex) * _Color2;
  122.  
  123.                  float speed = _Time.x * _ScrollSpeed;
  124.  
  125.                      // triplanar noise
  126.                  float3 blendNormal = saturate(pow(IN.worldNormal * 1.4, 4));
  127.                  half4 nSide1 = tex2D(_Noise, (IN.worldPos.xy + speed) * _NScale);
  128.                  half4 nSide2 = tex2D(_Noise, (IN.worldPos.xz + speed) * _NScale);
  129.                  half4 nTop = tex2D(_Noise, (IN.worldPos.yz + speed) * _NScale);
  130.  
  131.                  float3 noisetexture = nSide1;
  132.                  noisetexture = lerp(noisetexture, nTop, blendNormal.x);
  133.                  noisetexture = lerp(noisetexture, nSide2, blendNormal.y);
  134.  
  135.                      // distance influencer position to world position
  136.                  float3 dis = distance(_PositionMoving, IN.worldPos);
  137.                  float3 sphere = 1 - saturate(dis / _Radius);
  138.  
  139.                  float3 sphereNoise = noisetexture.r * sphere;
  140.  
  141.                  float3 DissolveLine = step(sphereNoise - _DisLineWidth, _DisAmount) * step(_DisAmount, sphereNoise); // line between two textures
  142.                  DissolveLine *= _DisLineColor; // color the line
  143.  
  144.                  float3 primaryTex = (step(sphereNoise - _DisLineWidth, _DisAmount) * c.rgb);
  145.                  float3 secondaryTex = (step(_DisAmount, sphereNoise) * c2.rgb);
  146.                  float3 resultTex = primaryTex + secondaryTex + DissolveLine;
  147.                  o.Albedo = resultTex;
  148.  
  149.                  o.Emission = DissolveLine * 2;
  150.                  o.Alpha = c.a;
  151.                 }
  152.              ENDCG
  153.     }
  154.         Fallback "Diffuse"
  155. }
RAW Paste Data