源战役客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

140 line
4.7 KiB

  1. Shader "Unlit/DualBlur"
  2. {
  3. Properties
  4. {
  5. _MainTex ("Texture", 2D) = "white" {}
  6. _Offset("BlurOffset", float) = 1
  7. }
  8. SubShader
  9. {
  10. CGINCLUDE
  11. #include "UnityCG.cginc"
  12. uniform sampler2D _MainTex;
  13. uniform float4 _MainTex_ST;
  14. uniform half _Offset;
  15. float4 _MainTex_TexelSize;
  16. struct a2f_default
  17. {
  18. float4 vertex : POSITION;
  19. float2 uv : TEXCOORD0;
  20. };
  21. // 降采样 顶-片结构体
  22. struct v2f_downSample
  23. {
  24. float4 vertex : SV_POSITION;
  25. float2 texcoord: TEXCOORD0;
  26. float2 uv: TEXCOORD1;
  27. float4 uv01: TEXCOORD2;
  28. float4 uv23: TEXCOORD3;
  29. };
  30. // 升采样 顶-片结构体
  31. struct v2f_upSample
  32. {
  33. float4 vertex: SV_POSITION;
  34. float2 texcoord: TEXCOORD0;
  35. float4 uv01: TEXCOORD1;
  36. float4 uv23: TEXCOORD2;
  37. float4 uv45: TEXCOORD3;
  38. float4 uv67: TEXCOORD4;
  39. };
  40. v2f_downSample VertDownSample(a2f_default v)
  41. {
  42. v2f_downSample o;
  43. o.vertex = UnityObjectToClipPos(v.vertex);
  44. o.texcoord = v.uv;
  45. #if UNITY_UV_STARTS_AT_TOP
  46. o.texcoord = o.texcoord * float2(1.0, -1.0) + float2(0.0, 1.0);
  47. #endif
  48. float2 uv = TRANSFORM_TEX(o.texcoord, _MainTex);
  49. _MainTex_TexelSize *= 0.5;
  50. o.uv = uv;
  51. o.uv01.xy = uv - _MainTex_TexelSize * float2(1 + _Offset, 1 + _Offset);//top right
  52. o.uv01.zw = uv + _MainTex_TexelSize * float2(1 + _Offset, 1 + _Offset);//bottom left
  53. o.uv23.xy = uv - float2(_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * float2(1 + _Offset, 1 + _Offset);//top left
  54. o.uv23.zw = uv + float2(_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * float2(1 + _Offset, 1 + _Offset);//bottom right
  55. return o;
  56. }
  57. half4 FragDownSample(v2f_downSample i): SV_Target
  58. {
  59. half4 sum = tex2D(_MainTex, i.uv) * 4;
  60. sum += tex2D(_MainTex, i.uv01.xy);
  61. sum += tex2D(_MainTex, i.uv01.zw);
  62. sum += tex2D(_MainTex, i.uv23.xy);
  63. sum += tex2D(_MainTex, i.uv23.zw);
  64. return half4(sum.rgb * 0.125, 1.0);
  65. }
  66. v2f_upSample VertUpSample(a2f_default v)
  67. {
  68. v2f_upSample o;
  69. o.vertex = UnityObjectToClipPos(v.vertex);
  70. o.texcoord = v.uv;
  71. #if UNITY_UV_STARTS_AT_TOP
  72. o.texcoord = o.texcoord * float2(1.0, -1.0) + float2(0.0, 1.0);
  73. #endif
  74. float2 uv = TRANSFORM_TEX(o.texcoord, _MainTex);
  75. _MainTex_TexelSize *= 0.5;
  76. _Offset = float2(1 + _Offset, 1 + _Offset);
  77. o.uv01.xy = uv + float2(-_MainTex_TexelSize.x * 2, 0) * _Offset;
  78. o.uv01.zw = uv + float2(-_MainTex_TexelSize.x, _MainTex_TexelSize.y) * _Offset;
  79. o.uv23.xy = uv + float2(0, _MainTex_TexelSize.y * 2) * _Offset;
  80. o.uv23.zw = uv + _MainTex_TexelSize * _Offset;
  81. o.uv45.xy = uv + float2(_MainTex_TexelSize.x * 2, 0) * _Offset;
  82. o.uv45.zw = uv + float2(_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * _Offset;
  83. o.uv67.xy = uv + float2(0, -_MainTex_TexelSize.y * 2) * _Offset;
  84. o.uv67.zw = uv - _MainTex_TexelSize * _Offset;
  85. return o;
  86. }
  87. half4 FragUpSample(v2f_upSample i): SV_Target
  88. {
  89. half4 sum = 0;
  90. sum += tex2D(_MainTex, i.uv01.xy);
  91. sum += tex2D(_MainTex, i.uv01.zw) * 2;
  92. sum += tex2D(_MainTex, i.uv23.xy);
  93. sum += tex2D(_MainTex, i.uv23.zw) * 2;
  94. sum += tex2D(_MainTex, i.uv45.xy);
  95. sum += tex2D(_MainTex, i.uv45.zw) * 2;
  96. sum += tex2D(_MainTex, i.uv67.xy);
  97. sum += tex2D(_MainTex, i.uv67.zw) * 2;
  98. return half4(sum.rgb * 0.0833, 1.0);
  99. }
  100. ENDCG
  101. Cull Off ZWrite Off ZTest Always
  102. Pass
  103. {
  104. CGPROGRAM
  105. #pragma vertex VertDownSample
  106. #pragma fragment FragDownSample
  107. // #pragma enable_d3d11_debug_symbols
  108. ENDCG
  109. }
  110. Pass
  111. {
  112. CGPROGRAM
  113. #pragma vertex VertUpSample
  114. #pragma fragment FragUpSample
  115. // #pragma enable_d3d11_debug_symbols
  116. ENDCG
  117. }
  118. }
  119. }