UIBlur.cginc 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #ifndef UI_BLUR_CGINC
  2. #define UI_BLUR_CGINC
  3. #include "UnityCG.cginc"
  4. // Pixel size.
  5. static const float2 ps = _ScreenParams.zw - 1.0;
  6. // Parameters.
  7. sampler2D _MainTex;
  8. float _Opacity, _Size;
  9. // Functions.
  10. // Creates a linear blur from a projected texture.
  11. // The blur is made centered, so the direction is always absolute.
  12. // sp - Texture sampler.
  13. // uv - Texture coordinates.
  14. // dir - Blur direction vector.
  15. float4 linear_blur(sampler2D sp, float4 uv, float2 dir) {
  16. static const int samples = 9;
  17. float4 color = 0.0;
  18. // Move coordinates in opposite direction to center the sampling.
  19. uv = UNITY_PROJ_COORD(float4(
  20. uv.x - dir.x * samples * 0.5,
  21. uv.y - dir.y * samples * 0.5,
  22. uv.z,
  23. uv.w
  24. ));
  25. [unroll]
  26. for (int i = 0; i < samples; ++i) {
  27. uv = UNITY_PROJ_COORD(float4(
  28. uv.x + dir.x,
  29. uv.y + dir.y,
  30. uv.z,
  31. uv.w
  32. ));
  33. color += tex2Dproj(sp, uv);
  34. }
  35. return color / samples;
  36. }
  37. // Vertex shaders.
  38. void VS_Quad(
  39. float4 v : POSITION,
  40. out float4 p : SV_POSITION,
  41. inout float2 uv : TEXCOORD
  42. ) {
  43. p = UnityObjectToClipPos(v);
  44. }
  45. void VS_QuadProj(
  46. float4 v : POSITION,
  47. out float4 p : SV_POSITION,
  48. inout float2 uv1 : TEXCOORD0,
  49. out float4 uv2 : TEXCOORD1
  50. ) {
  51. VS_Quad(v, p, uv1);
  52. uv2 = ComputeGrabScreenPos(p);
  53. }
  54. void VS_QuadProjColor(
  55. float4 v : POSITION,
  56. out float4 p : SV_POSITION,
  57. inout float2 uv1 : TEXCOORD0,
  58. out float4 uv2 : texcoord2,
  59. inout float4 img_color : COLOR
  60. ) {
  61. VS_QuadProj(v, p, uv1, uv2);
  62. }
  63. // Pixel shader functions (for changing the grab pass texture).
  64. float4 blur_x(float2 img_uv, float4 grab_uv, sampler2D grab_tex) {
  65. float2 dir = float2(ps.x * _Size, 0.0);
  66. float4 blur = linear_blur(grab_tex, grab_uv, dir);
  67. blur.a = 1.0;
  68. float4 color = tex2D(_MainTex, img_uv);
  69. return blur * color.a;
  70. }
  71. float4 blur_y(float2 img_uv, float4 grab_uv, float4 img_color, sampler2D grab_tex) {
  72. float2 dir = float2(0.0, ps.y * _Size);
  73. float4 blur = linear_blur(grab_tex, grab_uv, dir);
  74. blur.a = 1.0;
  75. float4 color = tex2D(_MainTex, img_uv) * img_color;
  76. color = lerp(blur * color.a, color, _Opacity);
  77. return color;
  78. }
  79. #endif