|
|
- Shader "SaberShad/RadiusBlur"
- {
- Properties
- {
- [HideInInspector]_MainTex ("Texture", 2D) = "white" {}
- // 径向模糊数据 xy分量代表径向中心点 z分量代表偏移
- _RadiusData("Radius Data", Vector) = (0.5, 0.5, 0.0, 1.0)
- // y分量代表迭代次数的倒数 例如迭代30次就是1/30
- _RadiusIterationData("Radius Iteration", Vector) = (1.0, 1.0, 0.0, 0.0)
- }
- SubShader
- {
- CGINCLUDE
- #include "UnityCG.cginc"
-
- sampler2D _MainTex;
- float4 _MainTex_ST;
- float4 _MainTex_TexelSize;
- half3 _RadiusData;
- half2 _RadiusIterationData;
-
- struct a2f_rb
- {
- float4 vertex : POSITION;
- float2 uv : TEXCOORD0;
- };
-
- struct v2f_rb
- {
- float4 vertex : SV_POSITION;
- float2 texcoord: TEXCOORD0;
- };
-
- v2f_rb RadiusBlurVertex(a2f_rb v)
- {
- v2f_rb o;
- o.vertex = UnityObjectToClipPos(v.vertex);
- o.texcoord = v.uv;
- // #if UNITY_UV_STARTS_AT_TOP
- // o.texcoord = o.texcoord * float2(1.0, -1.0) + float2(0.0, 1.0);
- // #endif
- o.texcoord = TRANSFORM_TEX(o.texcoord, _MainTex);
-
- return o;
- }
-
- half4 RadiusBlurFragment(v2f_rb i): SV_Target
- {
- half2 radiusRange = (_RadiusData.xy - i.texcoord.xy) * _RadiusData.z;
-
- half4 color = 0.0;
- [unroll(30)]
- for(int j = 0; j < _RadiusIterationData.x; j++)
- {
- color += tex2D(_MainTex, i.texcoord);
- i.texcoord += radiusRange;
- }
-
- return color * _RadiusIterationData.y;
- }
- ENDCG
-
- Cull Off ZWrite Off ZTest Always
-
- Pass
- {
- CGPROGRAM
-
- #pragma vertex RadiusBlurVertex
- #pragma fragment RadiusBlurFragment
-
- ENDCG
-
- }
- }
- }
|