Shader "Custom/UIOutlineShader" { Properties { _MainTex ("Texture", 2D) = "white" {} _OutlineColor ("Outline Color", Color) = (1,1,1,1) _OutlineWidth ("Outline Width", Range(0.0, 10.0)) = 1.0 } SubShader { Tags {"Queue"="Overlay" "IgnoreProjector"="True" "RenderType"="Transparent"} Lighting Off ZWrite Off ZTest Always Blend SrcAlpha OneMinusSrcAlpha Cull Off Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata_t { float4 vertex : POSITION; float2 texcoord : TEXCOORD0; }; struct v2f { float4 pos : POSITION; float2 texcoord : TEXCOORD0; }; sampler2D _MainTex; float4 _MainTex_ST; float4 _OutlineColor; float _OutlineWidth; v2f vert(appdata_t v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); o.texcoord = v.texcoord; return o; } float4 frag(v2f i) : COLOR { float4 mainColor = tex2D(_MainTex, i.texcoord); // Get texture size float2 texelSize = float2(_OutlineWidth / _ScreenParams.x, _OutlineWidth / _ScreenParams.y); // Sampling neighboring pixels float alpha = tex2D(_MainTex, i.texcoord + texelSize.xy).a + tex2D(_MainTex, i.texcoord - texelSize.xy).a + tex2D(_MainTex, i.texcoord + float2(-texelSize.x, texelSize.y)).a + tex2D(_MainTex, i.texcoord + float2(texelSize.x, -texelSize.y)).a; alpha = step(0.01, alpha) * (1 - mainColor.a); float4 outlineColor = _OutlineColor * alpha; return outlineColor + mainColor; } ENDCG } } FallBack "Unlit/Transparent" }