70 lines
2.1 KiB
Plaintext
70 lines
2.1 KiB
Plaintext
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"
|
|
}
|