Blur.shader 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. Shader "Custom/Blur"
  2. {
  3. Properties
  4. {
  5. _Blur("Blur", float) = 10
  6. }
  7. SubShader
  8. {
  9. Tags{ "Queue" = "Transparent"
  10. }
  11. GrabPass
  12. {}
  13. Pass
  14. {
  15. CGPROGRAM
  16. #pragma vertex vert
  17. #pragma fragment frag
  18. #include "UnityCG.cginc"
  19. struct appdata
  20. {
  21. float4 vertex : POSITION;
  22. float2 uv : TEXCOORD0;
  23. fixed4 color : COLOR;
  24. };
  25. struct v2f
  26. {
  27. float4 grabPos : TEXCOORD0;
  28. float4 pos : SV_POSITION;
  29. float4 vertColor : COLOR;
  30. };
  31. v2f vert(appdata v)
  32. {
  33. v2f o;
  34. o.pos = UnityObjectToClipPos(v.vertex);
  35. o.grabPos = ComputeGrabScreenPos(o.pos);
  36. o.vertColor = v.color;
  37. return o;
  38. }
  39. sampler2D _GrabTexture;
  40. fixed4 _GrabTexture_TexelSize;
  41. float _Blur;
  42. half4 frag(v2f i) : SV_Target
  43. {
  44. float blur = _Blur;
  45. blur = max(1, blur);
  46. fixed4 col = (0, 0, 0, 0);
  47. float weight_total = 0;
  48. [loop]
  49. for (float x = -blur; x <= blur; x += 1)
  50. {
  51. float distance_normalized = abs(x / blur);
  52. float weight = exp(-0.5 * pow(distance_normalized, 2) * 5.0);
  53. weight_total += weight;
  54. col += tex2Dproj(_GrabTexture, i.grabPos + float4(x * _GrabTexture_TexelSize.x, 0, 0, 0)) * weight;
  55. }
  56. col /= weight_total;
  57. return col;
  58. }
  59. ENDCG
  60. }
  61. GrabPass
  62. {}
  63. Pass
  64. {
  65. CGPROGRAM
  66. #pragma vertex vert
  67. #pragma fragment frag
  68. #include "UnityCG.cginc"
  69. struct appdata
  70. {
  71. float4 vertex : POSITION;
  72. float2 uv : TEXCOORD0;
  73. fixed4 color : COLOR;
  74. };
  75. struct v2f
  76. {
  77. float4 grabPos : TEXCOORD0;
  78. float4 pos : SV_POSITION;
  79. float4 vertColor : COLOR;
  80. };
  81. v2f vert(appdata v)
  82. {
  83. v2f o;
  84. o.pos = UnityObjectToClipPos(v.vertex);
  85. o.grabPos = ComputeGrabScreenPos(o.pos);
  86. o.vertColor = v.color;
  87. return o;
  88. }
  89. sampler2D _GrabTexture;
  90. fixed4 _GrabTexture_TexelSize;
  91. float _Blur;
  92. half4 frag(v2f i) : SV_Target
  93. {
  94. float blur = _Blur;
  95. blur = max(1, blur);
  96. fixed4 col = (0, 0, 0, 0);
  97. float weight_total = 0;
  98. [loop]
  99. for (float y = -blur; y <= blur; y += 1)
  100. {
  101. float distance_normalized = abs(y / blur);
  102. float weight = exp(-0.5 * pow(distance_normalized, 2) * 5.0);
  103. weight_total += weight;
  104. col += tex2Dproj(_GrabTexture, i.grabPos + float4(0, y * _GrabTexture_TexelSize.y, 0, 0)) * weight;
  105. }
  106. col /= weight_total;
  107. return col;
  108. }
  109. ENDCG
  110. }
  111. }
  112. }