GlassBlur.shader 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. Shader "Custom/GlassBlur"
  2. {
  3. Properties
  4. {
  5. _MainTex ("Base (RGB)", 2D) = "white" {}
  6. _BlurSize ("Blur Size", Range(0, 10)) = 1.0
  7. _Intensity ("Intensity", Range(0, 1)) = 0.5
  8. }
  9. SubShader
  10. {
  11. Tags { "RenderType"="Opaque" }
  12. LOD 200
  13. CGINCLUDE
  14. #include "UnityCG.cginc"
  15. sampler2D _MainTex;
  16. float4 _MainTex_TexelSize;
  17. float _BlurSize;
  18. float _Intensity;
  19. struct v2f
  20. {
  21. float4 pos : SV_POSITION;
  22. float2 uv : TEXCOORD0;
  23. };
  24. v2f vert(appdata_img v)
  25. {
  26. v2f o;
  27. o.pos = UnityObjectToClipPos(v.vertex);
  28. o.uv = v.texcoord;
  29. return o;
  30. }
  31. // 高斯模糊函数
  32. float4 gaussianBlur(v2f i, float2 direction)
  33. {
  34. float4 color = float4(0, 0, 0, 0);
  35. float2 offsets[9] = {
  36. float2(-1, -1), float2(0, -1), float2(1, -1),
  37. float2(-1, 0), float2(0, 0), float2(1, 0),
  38. float2(-1, 1), float2(0, 1), float2(1, 1)
  39. };
  40. float weights[9] = {
  41. 0.05, 0.1, 0.05,
  42. 0.1, 0.4, 0.1,
  43. 0.05, 0.1, 0.05
  44. };
  45. for(int j = 0; j < 9; j++)
  46. {
  47. float2 uv = i.uv + offsets[j] * _MainTex_TexelSize.xy * _BlurSize * direction;
  48. color += tex2D(_MainTex, uv) * weights[j];
  49. }
  50. return color;
  51. }
  52. ENDCG
  53. // 水平模糊 Pass
  54. Pass
  55. {
  56. CGPROGRAM
  57. #pragma vertex vert
  58. #pragma fragment frag
  59. float4 frag(v2f i) : SV_Target
  60. {
  61. return gaussianBlur(i, float2(1, 0));
  62. }
  63. ENDCG
  64. }
  65. // 垂直模糊 Pass
  66. Pass
  67. {
  68. CGPROGRAM
  69. #pragma vertex vert
  70. #pragma fragment frag
  71. float4 frag(v2f i) : SV_Target
  72. {
  73. return gaussianBlur(i, float2(0, 1));
  74. }
  75. ENDCG
  76. }
  77. // 混合 Pass
  78. Pass
  79. {
  80. CGPROGRAM
  81. #pragma vertex vert
  82. #pragma fragment frag
  83. sampler2D _BlurTex;
  84. float4 frag(v2f i) : SV_Target
  85. {
  86. float4 original = tex2D(_MainTex, i.uv);
  87. float4 blurred = tex2D(_BlurTex, i.uv);
  88. return lerp(original, blurred, _Intensity);
  89. }
  90. ENDCG
  91. }
  92. }
  93. FallBack "Diffuse"
  94. }