Shader "Custom/Outline" { Properties { _MainTex ("Texture", 2D) = "white" {} _OutlineColor ("Outline Color", Color) = (0,0,0,1) _OutlineThickness ("Outline Thickness", Range(0.0, 0.03)) = 0.01 } SubShader { Tags { "Queue" = "Overlay" } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; float4 posWorld : TEXCOORD1; }; sampler2D _MainTex; float4 _MainTex_ST; float4 _OutlineColor; float _OutlineThickness; v2f vert(appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); o.posWorld = mul(unity_ObjectToWorld, v.vertex); return o; } float4 frag(v2f i) : SV_Target { float4 texCol = tex2D(_MainTex, i.uv); float2 pixelSize = fwidth(i.uv) * _OutlineThickness; float2 uvOffsets[8] = { float2(1, 0), float2(-1, 0), float2(0, 1), float2(0, -1), float2(1, 1), float2(-1, -1), float2(1, -1), float2(-1, 1) }; float outline = 0.0; for (int j = 0; j < 8; j++) { outline += 1.0 - tex2D(_MainTex, i.uv + uvOffsets[j] * pixelSize).a; } outline = clamp(outline, 0.0, 1.0); float4 outlineColor = _OutlineColor * outline; return texCol + outlineColor * (1 - texCol.a); } ENDCG } } }