源战役客户端
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

221 linhas
7.2 KiB

  1. Shader "Unlit/DualBlurBloom"
  2. {
  3. Properties
  4. {
  5. _MainTex ("Texture", 2D) = "white" {}
  6. _Bloom ("Bloom (RGB)", 2D) = "black" {}
  7. _Threshold("Threshold", float) = 0.5
  8. _Intensity("Intensity", float) = 0.5
  9. _Offset("BlurOffset", float) = 1
  10. }
  11. SubShader
  12. {
  13. CGINCLUDE
  14. #include "UnityCG.cginc"
  15. sampler2D _MainTex;
  16. float4 _MainTex_ST;
  17. half _Offset, _Threshold, _Intensity;
  18. sampler2D _Bloom;
  19. float4 _MainTex_TexelSize;
  20. struct a2f_default
  21. {
  22. float4 vertex : POSITION;
  23. float2 uv : TEXCOORD0;
  24. };
  25. struct v2f_luminace
  26. {
  27. float4 pos : SV_POSITION;
  28. half2 uv : TEXCOORD0;
  29. };
  30. // 降采样 顶-片结构体
  31. struct v2f_downSample
  32. {
  33. float4 vertex : SV_POSITION;
  34. float2 texcoord: TEXCOORD0;
  35. float2 uv: TEXCOORD1;
  36. float4 uv01: TEXCOORD2;
  37. float4 uv23: TEXCOORD3;
  38. };
  39. // 升采样 顶-片结构体
  40. struct v2f_upSample
  41. {
  42. float4 vertex: SV_POSITION;
  43. float2 texcoord: TEXCOORD0;
  44. float4 uv01: TEXCOORD1;
  45. float4 uv23: TEXCOORD2;
  46. float4 uv45: TEXCOORD3;
  47. float4 uv67: TEXCOORD4;
  48. };
  49. struct v2f_simple
  50. {
  51. float4 pos : SV_POSITION;
  52. half2 uv : TEXCOORD0;
  53. #if UNITY_UV_STARTS_AT_TOP
  54. half2 uv2 : TEXCOORD1;
  55. #endif
  56. };
  57. v2f_simple vertBloom ( appdata_img v )
  58. {
  59. v2f_simple o;
  60. o.pos = UnityObjectToClipPos(v.vertex);
  61. o.uv = UnityStereoScreenSpaceUVAdjust(v.texcoord, _MainTex_ST);
  62. #if UNITY_UV_STARTS_AT_TOP
  63. o.uv2 = o.uv;
  64. if (_MainTex_TexelSize.y < 0.0)
  65. o.uv.y = 1.0 - o.uv.y;
  66. #endif
  67. return o;
  68. }
  69. fixed4 fragBloom ( v2f_simple i ) : SV_Target
  70. {
  71. #if UNITY_UV_STARTS_AT_TOP
  72. fixed4 color = tex2D(_MainTex, i.uv2);
  73. return color + tex2D(_Bloom, i.uv);
  74. #else
  75. fixed4 color = tex2D(_MainTex, i.uv);
  76. return color + tex2D(_Bloom, i.uv);
  77. #endif
  78. }
  79. v2f_luminace vertLuminace ( appdata_img v )
  80. {
  81. v2f_luminace o;
  82. o.pos = UnityObjectToClipPos(v.vertex);
  83. o.uv = UnityStereoScreenSpaceUVAdjust(v.texcoord + _MainTex_TexelSize.xy, _MainTex_ST);
  84. return o;
  85. }
  86. fixed4 fragLuminace ( v2f_luminace i ) : SV_Target
  87. {
  88. fixed4 color = tex2D (_MainTex, i.uv);
  89. return max(color - _Threshold, 0) * _Intensity;
  90. }
  91. v2f_downSample VertDownSample(a2f_default v)
  92. {
  93. v2f_downSample o;
  94. o.vertex = UnityObjectToClipPos(v.vertex);
  95. o.texcoord = v.uv;
  96. #if UNITY_UV_STARTS_AT_TOP
  97. o.texcoord = o.texcoord * float2(1.0, -1.0) + float2(0.0, 1.0);
  98. #endif
  99. float2 uv = TRANSFORM_TEX(o.texcoord, _MainTex);
  100. _MainTex_TexelSize *= 0.5;
  101. o.uv = uv;
  102. o.uv01.xy = uv - _MainTex_TexelSize * float2(1 + _Offset, 1 + _Offset);//top right
  103. o.uv01.zw = uv + _MainTex_TexelSize * float2(1 + _Offset, 1 + _Offset);//bottom left
  104. o.uv23.xy = uv - float2(_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * float2(1 + _Offset, 1 + _Offset);//top left
  105. o.uv23.zw = uv + float2(_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * float2(1 + _Offset, 1 + _Offset);//bottom right
  106. return o;
  107. }
  108. half4 FragDownSample(v2f_downSample i): SV_Target
  109. {
  110. half4 sum = tex2D(_MainTex, i.uv) * 4;
  111. sum += tex2D(_MainTex, i.uv01.xy);
  112. sum += tex2D(_MainTex, i.uv01.zw);
  113. sum += tex2D(_MainTex, i.uv23.xy);
  114. sum += tex2D(_MainTex, i.uv23.zw);
  115. return half4(sum.rgb * 0.125, 1.0);
  116. }
  117. v2f_upSample VertUpSample(a2f_default v)
  118. {
  119. v2f_upSample o;
  120. o.vertex = UnityObjectToClipPos(v.vertex);
  121. o.texcoord = v.uv;
  122. #if UNITY_UV_STARTS_AT_TOP
  123. o.texcoord = o.texcoord * float2(1.0, -1.0) + float2(0.0, 1.0);
  124. #endif
  125. float2 uv = TRANSFORM_TEX(o.texcoord, _MainTex);
  126. _MainTex_TexelSize *= 0.5;
  127. _Offset = float2(1 + _Offset, 1 + _Offset);
  128. o.uv01.xy = uv + float2(-_MainTex_TexelSize.x * 2, 0) * _Offset;
  129. o.uv01.zw = uv + float2(-_MainTex_TexelSize.x, _MainTex_TexelSize.y) * _Offset;
  130. o.uv23.xy = uv + float2(0, _MainTex_TexelSize.y * 2) * _Offset;
  131. o.uv23.zw = uv + _MainTex_TexelSize * _Offset;
  132. o.uv45.xy = uv + float2(_MainTex_TexelSize.x * 2, 0) * _Offset;
  133. o.uv45.zw = uv + float2(_MainTex_TexelSize.x, -_MainTex_TexelSize.y) * _Offset;
  134. o.uv67.xy = uv + float2(0, -_MainTex_TexelSize.y * 2) * _Offset;
  135. o.uv67.zw = uv - _MainTex_TexelSize * _Offset;
  136. return o;
  137. }
  138. half4 FragUpSample(v2f_upSample i): SV_Target
  139. {
  140. half4 sum = 0;
  141. sum += tex2D(_MainTex, i.uv01.xy);
  142. sum += tex2D(_MainTex, i.uv01.zw) * 2;
  143. sum += tex2D(_MainTex, i.uv23.xy);
  144. sum += tex2D(_MainTex, i.uv23.zw) * 2;
  145. sum += tex2D(_MainTex, i.uv45.xy);
  146. sum += tex2D(_MainTex, i.uv45.zw) * 2;
  147. sum += tex2D(_MainTex, i.uv67.xy);
  148. sum += tex2D(_MainTex, i.uv67.zw) * 2;
  149. return half4(sum.rgb * 0.0833, 1.0);
  150. }
  151. ENDCG
  152. Cull Off ZWrite Off ZTest Always
  153. Pass {
  154. CGPROGRAM
  155. #pragma vertex vertBloom
  156. #pragma fragment fragBloom
  157. // #pragma enable_d3d11_debug_symbols
  158. ENDCG
  159. }
  160. Pass
  161. {
  162. CGPROGRAM
  163. #pragma vertex VertDownSample
  164. #pragma fragment FragDownSample
  165. // #pragma enable_d3d11_debug_symbols
  166. ENDCG
  167. }
  168. Pass
  169. {
  170. CGPROGRAM
  171. #pragma vertex VertUpSample
  172. #pragma fragment FragUpSample
  173. // #pragma enable_d3d11_debug_symbols
  174. ENDCG
  175. }
  176. // 根据阈值和强度获取需要进行模糊的RT
  177. Pass {
  178. CGPROGRAM
  179. #pragma vertex vertLuminace
  180. #pragma fragment fragLuminace
  181. // #pragma enable_d3d11_debug_symbols
  182. ENDCG
  183. }
  184. }
  185. }