mao.shader 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. 
  2. Shader "Custom/WaterBlur" {
  3. Properties{
  4. _blurSizeXY("BlurSizeXY", Range(0,15)) = 2
  5. }
  6. SubShader{
  7. Tags {
  8. "IgnoreProjector" = "True"
  9. "Queue" = "Transparent"
  10. "RenderType" = "Transparent"
  11. "CanUseSpriteAtlas" = "True"
  12. "PreviewType" = "Plane"
  13. }
  14. //获取屏幕纹理,必须的
  15. GrabPass { }
  16. // Render the object with the texture generated above
  17. Pass {
  18. CGPROGRAM
  19. #pragma debug
  20. #pragma vertex vert
  21. #pragma fragment frag
  22. #pragma target 3.0
  23. //屏幕纹理定义
  24. sampler2D _GrabTexture : register(s0);
  25. float _blurSizeXY;
  26. struct data {
  27. float4 vertex : POSITION;
  28. float3 normal : NORMAL;
  29. };
  30. struct v2f {
  31. float4 position : POSITION;
  32. float4 screenPos : TEXCOORD0;
  33. };
  34. v2f vert(data i) {
  35. v2f o;
  36. o.position = UnityObjectToClipPos(i.vertex);
  37. o.screenPos = o.position;
  38. return o;
  39. }
  40. //核心逻辑就是使用多次采样纹理,然后混合多次,采样的对象是屏幕纹理,实现高斯模糊
  41. half4 frag(v2f i) : COLOR
  42. {
  43. //模糊的原理就是错开uv来采样,实现模糊
  44. float2 screenPos = i.screenPos.xy / i.screenPos.w;
  45. float depth = _blurSizeXY * 0.0005;
  46. screenPos.x = (screenPos.x + 1) * 0.5;
  47. screenPos.y = 1 - (screenPos.y + 1) * 0.5;
  48. half4 sum = half4(0.0h,0.0h,0.0h,0.0h);
  49. sum += tex2D(_GrabTexture, float2(screenPos.x - 5.0 * depth, screenPos.y + 3.0 * depth)) * 0.025;
  50. sum += tex2D(_GrabTexture, float2(screenPos.x + 5.0 * depth, screenPos.y - 3.0 * depth)) * 0.025;
  51. sum += tex2D(_GrabTexture, float2(screenPos.x - 4.0 * depth, screenPos.y + 2.5 * depth)) * 0.05;
  52. sum += tex2D(_GrabTexture, float2(screenPos.x + 4.0 * depth, screenPos.y - 2.5 * depth)) * 0.05;
  53. sum += tex2D(_GrabTexture, float2(screenPos.x - 3.0 * depth, screenPos.y + 2.0 * depth)) * 0.09;
  54. sum += tex2D(_GrabTexture, float2(screenPos.x + 3.0 * depth, screenPos.y - 2.0 * depth)) * 0.09;
  55. sum += tex2D(_GrabTexture, float2(screenPos.x - 2.0 * depth, screenPos.y + 1.5 * depth)) * 0.12;
  56. sum += tex2D(_GrabTexture, float2(screenPos.x + 2.0 * depth, screenPos.y - 1.5 * depth)) * 0.12;
  57. sum += tex2D(_GrabTexture, float2(screenPos.x - 1.0 * depth, screenPos.y + 1.0 * depth)) * 0.15;
  58. sum += tex2D(_GrabTexture, float2(screenPos.x + 1.0 * depth, screenPos.y - 1.0 * depth)) * 0.15;
  59. sum += tex2D(_GrabTexture, screenPos - 3.0 * depth) * 0.025;
  60. sum += tex2D(_GrabTexture, screenPos - 2.5 * depth) * 0.05;
  61. sum += tex2D(_GrabTexture, screenPos - 2.0 * depth) * 0.09;
  62. sum += tex2D(_GrabTexture, screenPos - 1.5 * depth) * 0.12;
  63. sum += tex2D(_GrabTexture, screenPos - 1.0 * depth) * 0.15;
  64. sum += tex2D(_GrabTexture, screenPos) * 0.16;
  65. sum += tex2D(_GrabTexture, screenPos + 3.0 * depth) * 0.15;
  66. sum += tex2D(_GrabTexture, screenPos + 2.5 * depth) * 0.12;
  67. sum += tex2D(_GrabTexture, screenPos + 2.0 * depth) * 0.09;
  68. sum += tex2D(_GrabTexture, screenPos + 1.5 * depth) * 0.05;
  69. sum += tex2D(_GrabTexture, screenPos + 1.0 * depth) * 0.025;
  70. return sum / 2;
  71. }
  72. ENDCG
  73. }
  74. }
  75. Fallback Off
  76. }