Shader "Hidden/EfficientBlur" { Properties { _MainTex ("Texture", 2D) = "white" {} } CGINCLUDE #include "UnityCG.cginc" sampler2D _MainTex; half4 _MainTex_TexelSize; half4 _MainTex_ST; uniform half _Radius; struct v2f { half4 vertex : SV_POSITION; half4 texcoord : TEXCOORD0; }; /*struct appdata { half4 vertex : POSITION; half2 texcoord: TEXCOORD0; }*/ v2f vert(appdata_img v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); half4 offset = half2(-0.5h, 0.5h).xxyy; //-x, -y, x, y offset *= _MainTex_TexelSize.xyxy; offset *= _Radius; o.texcoord = v.texcoord.xyxy + offset; return o; } half4 frag(v2f i) : SV_Target { // half4 o = // tex2D(_MainTex, i.texcoord.xw); // o += tex2D(_MainTex, i.texcoord.zw); // o += tex2D(_MainTex, i.texcoord.xy); // o += tex2D(_MainTex, i.texcoord.zy); // o /= 4.0; //Pray to the compiler god these will MAD half4 o = tex2D(_MainTex, i.texcoord.xw) / 4.0h; o += tex2D(_MainTex, i.texcoord.zw) / 4.0h; o += tex2D(_MainTex, i.texcoord.xy) / 4.0h; o += tex2D(_MainTex, i.texcoord.zy) / 4.0h; return o; } ENDCG SubShader { Cull Off ZWrite Off ZTest Always Blend Off Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag ENDCG } Pass { CGPROGRAM //Crop before blur #pragma vertex vertCrop #pragma fragment frag half4 _CropRegion; half2 getNewUV(half2 oldUV) { return lerp(_CropRegion.xy, _CropRegion.zw, oldUV); } v2f vertCrop(appdata_img v) { v2f o = vert(v); o.texcoord.xy = getNewUV(o.texcoord.xy); o.texcoord.zw = getNewUV(o.texcoord.zw); return o; } ENDCG } } FallBack Off }