RayShader.shader 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. Shader "Rokid/RayShader"
  2. {
  3. Properties
  4. {
  5. _Color ("Tint", Color) = (1.000000, 1.000000, 1.000000, 1.000000)
  6. _Length ("RayLength", Float) = 1
  7. _AlphaPow ("Ray Alpha Pow", Float) = 1
  8. [ToggleOff] _IsPress ("Pointer Press", Float) = 0
  9. }
  10. SubShader
  11. {
  12. Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }
  13. Pass
  14. {
  15. ZWrite OFF
  16. Blend SrcAlpha OneMinusSrcColor
  17. CGPROGRAM
  18. #pragma vertex vert
  19. #pragma fragment frag
  20. struct appdata
  21. {
  22. float4 vertex: POSITION;
  23. float2 uv: TEXCOORD0;
  24. };
  25. struct v2f
  26. {
  27. float2 uv: TEXCOORD0;
  28. float4 vertex: SV_POSITION;
  29. };
  30. fixed4 _Color;
  31. float _Length;
  32. float _IsPress;
  33. float _AlphaPow;
  34. v2f vert(appdata v)
  35. {
  36. v2f o;
  37. o.vertex = UnityObjectToClipPos(v.vertex);
  38. o.uv = v.uv;
  39. return o;
  40. }
  41. fixed4 frag(v2f i): SV_TARGET0
  42. {
  43. //处理虚线逻辑
  44. if (!_IsPress)
  45. {
  46. int count = _Length / 0.02;
  47. int val = ceil(i.uv.x * count) % 2;
  48. if (val == 0)
  49. _Color.a = 0;
  50. }
  51. //处理渐变
  52. if (i.uv.x < 0.5)
  53. _Color.a *= (i.uv.x * 2) * 2;
  54. if (i.uv.x > 0.5)
  55. _Color.a *= (1 - i.uv.x) * 2 * 2;
  56. _Color.a *= _AlphaPow;
  57. return fixed4(_Color.r * _Color.a, _Color.g * _Color.a, _Color.b * _Color.a, 1);
  58. }
  59. ENDCG
  60. }
  61. }
  62. }