RainSplash.shader 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. Shader "Funly/Sky Studio/Weather/Rain Splash"
  2. {
  3. Properties
  4. {
  5. [NoScaleOffset] _MainTex ("Sprite Texture", 2D) = "white" {}
  6. _SpriteColumnCount ("Sprite Columns", int) = 1
  7. _SpriteRowCount ("Sprite Rows", int) = 1
  8. _SpriteItemCount ("Sprite Total Items", int) = 1
  9. _AnimationSpeed ("Animation Speed", int) = 25
  10. _Intensity ("Intensity", Range(0, 1)) = .7
  11. }
  12. SubShader
  13. {
  14. Tags { "RenderType"="Transparent" "Queue"="Transparent" }
  15. LOD 100
  16. Blend OneMinusDstColor One
  17. Cull Off
  18. Pass
  19. {
  20. CGPROGRAM
  21. #pragma target 3.0
  22. #pragma vertex vert
  23. #pragma fragment frag
  24. #include "UnityCG.cginc"
  25. struct appdata
  26. {
  27. float4 vertex : POSITION;
  28. float2 uv : TEXCOORD0;
  29. };
  30. struct v2f
  31. {
  32. float2 uv : TEXCOORD0;
  33. float4 vertex : SV_POSITION;
  34. };
  35. sampler2D _MainTex;
  36. sampler2D _OverheadDepthTex;
  37. float4 _OverheadDepthPosition;
  38. float _OverheadDepthNearClip;
  39. float _OverheadDepthFarClip;
  40. float4 _OverheadDepthUV;
  41. float _SplashStartYPosition;
  42. int _SpriteColumnCount;
  43. int _SpriteRowCount;
  44. int _SpriteItemCount;
  45. int _AnimationSpeed;
  46. float _SpriteIndex;
  47. float _Intensity;
  48. int GetSpriteTargetIndex(int itemCount, int animationSpeed, float seed) {
  49. float spriteProgress = frac((_Time.y + (10.0f * seed)) / ((float)itemCount / (float)animationSpeed));
  50. return (int)(itemCount * spriteProgress);
  51. }
  52. float2 GetSpriteItemSize(float2 dimensions) {
  53. return float2(1.0f / dimensions.x, (1.0f / dimensions.x) * (dimensions.x / dimensions.y));
  54. }
  55. float2 GetSpriteSheetCoords(float2 uv, float2 dimensions, int targetFrameIndex, float2 itemSize, int numItems) {
  56. int rows = dimensions.y;
  57. int columns = dimensions.x;
  58. float2 scaledUV = float2(uv.x * itemSize.x, uv.y * itemSize.y);
  59. float2 offset = float2(
  60. targetFrameIndex % abs(columns) * itemSize.x,
  61. ((rows - 1) - (targetFrameIndex / abs(columns))) * itemSize.y);
  62. return scaledUV + offset;
  63. }
  64. float2 GetAnimatedSpriteCoords(float2 uv) {
  65. float2 dimensions = float2(_SpriteColumnCount, _SpriteRowCount);
  66. float2 itemSize = GetSpriteItemSize(dimensions);
  67. int spriteIndex = floor(_SpriteIndex);
  68. return GetSpriteSheetCoords(uv, dimensions, spriteIndex, itemSize, _SpriteItemCount);
  69. }
  70. v2f vert (appdata v)
  71. {
  72. v2f o;
  73. float4 checkUV = float4(_OverheadDepthUV.xy, 0.0f, 0.0f);
  74. float4 overInfo = tex2Dlod(_OverheadDepthTex, checkUV);
  75. float depthValue = overInfo.a;
  76. float distanceFromCamera = _OverheadDepthNearClip + _OverheadDepthFarClip * depthValue;
  77. float4 worldPos = mul(unity_ObjectToWorld, float4(v.vertex.xyz, 1.0f));
  78. float adjustedOrigin = _OverheadDepthPosition.y - distanceFromCamera;
  79. worldPos.y += adjustedOrigin - _SplashStartYPosition;
  80. o.vertex = mul(UNITY_MATRIX_VP, worldPos);
  81. o.uv = v.uv;
  82. return o;
  83. }
  84. fixed4 frag (v2f i) : SV_Target
  85. {
  86. float2 spriteUV = saturate(GetAnimatedSpriteCoords(i.uv));
  87. return tex2D(_MainTex, spriteUV) * _Intensity;
  88. }
  89. ENDCG
  90. }
  91. }
  92. Fallback "Unlit/Color"
  93. }