// 高斯模糊 Shader "Erika/Common/Image/MotionBlur" { Properties { _MainTex("Texture", 2D) = "white" {} _Angle("Angle", float) = 0 _Distance("Distance", float) = 0 _TileOffset("TileOffset", Vector) = (1,1,0,0) _Iterate("Iterate Count", float) = 1 } SubShader { Tags { "RenderType" = "Opaque" "Queue" = "Transparent-1"} LOD 100 ZWrite Off ZTest LEqual Blend SrcAlpha OneMinusSrcAlpha Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #include "Assets/Bundle/Shaders/Include/ImageEffect.cginc" struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; float _Angle; float4 _TileOffset; // 角色的范围 fixed _Distance; float _Iterate; // 迭代次数 v2f vert(appdata_img v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); return o; } fixed4 frag(v2f i) : SV_Target { _Distance = 0.1; fixed2 uv0 = i.uv; //fixed4 color = blur(_MainTex, _ScreenParams.xy, uv); fixed4 color = fixed4(0,0,0,0); const float count = 20; float step = _Distance / count; for(int i = 0; i < count; ++i) { fixed2 uv = uv0 + step * i * fixed2(cos(radians(_Angle)), sin(radians(_Angle))); if(uv.x > 1) continue; if(uv.x < 0) continue; color += tex2D(_MainTex, uv) * 1 / count; } return color; } ENDCG } } } // shader