LightningBoltShaderMesh.shader 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. Shader "Custom/LightningBoltShaderMesh"
  2. {
  3. Properties
  4. {
  5. [PerRendererData] _MainTex ("Main Texture (RGBA)", 2D) = "white" {}
  6. [PerRendererData] _TintColor ("Tint Color (RGB)", Color) = (1, 1, 1, 1)
  7. [PerRendererData] _InvFade ("Soft Particles Factor", Range(0.01, 100.0)) = 1.0
  8. [PerRendererData] _JitterMultiplier ("Jitter Multiplier (Float)", Float) = 0.0
  9. [PerRendererData] _Turbulence ("Turbulence (Float)", Float) = 0.0
  10. [PerRendererData] _TurbulenceVelocity ("Turbulence Velocity (Vector)", Vector) = (0, 0, 0, 0)
  11. [PerRendererData] _IntensityFlicker("Intensity flicker (Vector)", Vector) = (0, 0, 0, 0)
  12. [PerRendererData] _RenderMode("Render Mode - 0 = perspective, 1 = orthoxy, 2 = orthoxz (Int)", Int) = 0
  13. [PerRendererData] _SrcBlendMode("SrcBlendMode (Source Blend Mode)", Int) = 5 // SrcAlpha
  14. [PerRendererData] _DstBlendMode("DstBlendMode (Destination Blend Mode)", Int) = 1 // One, change to 10 for alpha blend instead of additive blend
  15. }
  16. SubShader
  17. {
  18. Tags { "Queue" = "Transparent" }
  19. Cull Off
  20. Lighting Off
  21. ZWrite Off
  22. ZTest LEqual
  23. ColorMask RGBA
  24. Blend [_SrcBlendMode] [_DstBlendMode]
  25. CGINCLUDE
  26. #include "lightningShader.cginc"
  27. #pragma vertex vert
  28. #pragma fragment frag
  29. #pragma fragmentoption ARB_precision_hint_fastest
  30. #pragma glsl_no_auto_normalization
  31. #pragma multi_compile_particles
  32. #pragma multi_compile_instancing
  33. ENDCG
  34. // glow pass
  35. Pass
  36. {
  37. Name "GlowPass"
  38. LOD 400
  39. CGPROGRAM
  40. v2f vert(appdata_t v)
  41. {
  42. WM_INSTANCE_VERT(v, v2f, o);
  43. float dirModifier = (v.texcoord.x - 0.5) + (v.texcoord.x - 0.5);
  44. float absRadius = abs(v.dir.w);
  45. float lineWidth = absRadius + absRadius;
  46. float jitter = 1.0 + (rand3(v.vertex) * _JitterMultiplier * 0.05);
  47. float t = _LightningTime.y;
  48. float glowWidthMultiplier = v.texcoord.z;
  49. float glowIntensity = v.texcoord.w;
  50. float elapsed = (t - v.fadeLifetime.r) / (v.fadeLifetime.a - v.fadeLifetime.r);
  51. float lineMultiplier = glowWidthMultiplier * lineWidth;
  52. float turbulence = lerp(0.0f, _Turbulence / max(0.5, absRadius), elapsed);
  53. float4 turbulenceVelocity = lerp(float4(0, 0, 0, 0), _TurbulenceVelocity, elapsed);
  54. UNITY_BRANCH
  55. if (_RenderMode == 0)
  56. {
  57. float4 turbulenceDirection = turbulenceVelocity + (float4(normalize(v.dir.xyz), 0) * turbulence);
  58. float3 directionBackwardsNormalized = normalize(v.dir2.xyz);
  59. float4 directionBackwards = float4(directionBackwardsNormalized * dirModifier * lineMultiplier * 1.5, 0);
  60. float3 directionToCamera = normalize(_WorldSpaceCameraPos - v.vertex);
  61. float4 tangent = float4(cross(directionBackwardsNormalized, directionToCamera), 0);
  62. dirModifier = v.dir.w / absRadius;
  63. float4 directionSideways = (tangent * lineMultiplier * dirModifier * jitter);
  64. o.pos = UnityObjectToClipPos(v.vertex + directionBackwards + directionSideways + turbulenceDirection);
  65. }
  66. else if (_RenderMode == 1)
  67. {
  68. float4 turbulenceDirection = float4(turbulenceVelocity.xy, 0, 0) + (float4(normalize(v.dir).xy, 0, 0) * turbulence);
  69. float2 directionBackwardsNormalized = normalize(v.dir2.xy);
  70. float4 directionBackwards = float4(directionBackwardsNormalized * dirModifier * lineMultiplier * 1.5, 0, 0);
  71. float2 tangent = normalize(float2(-v.dir2.y, v.dir2.x));
  72. dirModifier = v.dir.w / absRadius;
  73. float4 directionSideways = float4(tangent * lineMultiplier * dirModifier * jitter, 0, 0);
  74. o.pos = UnityObjectToClipPos(v.vertex + directionBackwards + directionSideways + turbulenceDirection);
  75. }
  76. else
  77. {
  78. float2 turbulenceDirection = (turbulenceVelocity.xz + normalize(v.dir.xz)) * turbulence;
  79. float4 turbulenceDirection4 = float4(turbulenceDirection.x, 0.0f, turbulenceDirection.y, 0.0f);
  80. float2 directionBackwardsNormalized = normalize(v.dir2.xz);
  81. float2 directionBackwards = directionBackwardsNormalized * dirModifier * lineMultiplier * 1.5;
  82. float4 directionBackwards4 = float4(directionBackwards.x, 0.0f, directionBackwards.y, 0.0f);
  83. float2 tangent = normalize(float2(-v.dir2.z, v.dir2.x));
  84. dirModifier = v.dir.w / absRadius;
  85. tangent = tangent * lineMultiplier * dirModifier * jitter;
  86. float4 directionSideways = float4(tangent.x, 0.0f, tangent.y, 0.0f);
  87. o.pos = UnityObjectToClipPos(v.vertex + directionBackwards4 + directionSideways + turbulenceDirection4);
  88. }
  89. o.color = (lerpColor(v.fadeLifetime) * _TintColor * fixed4(v.color.rgb, 1.0));
  90. o.color.a *= glowIntensity;
  91. o.texcoord = v.texcoord.xy;
  92. #if defined(SOFTPARTICLES_ON)
  93. o.projPos = ComputeScreenPos(o.pos);
  94. COMPUTE_EYEDEPTH(o.projPos.z);
  95. #endif
  96. return o;
  97. }
  98. ENDCG
  99. }
  100. }
  101. Fallback Off
  102. }