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
|
|
}
|