Unity3D2DSprite描边效果Shader,可⼿动调整效果适配最近两个⽉学了很多Shader的知识,现在也算⼊点门了。现在⽹上有很多2D描边的Shader,说实话⼤多数很差劲。有些多余的条件判断影响效率,提供的参数也不够适配所有图⽚。因为美术喜欢在图⽚上⾯加⼀些效果,再加上切图的时候背景图的透明部分不够多,或者透明通道透明不彻底等等问题,2D图⽚描边效果通常都不尽如⼈意。这种情况⼀般是要从美术那边⽤ps做调整,如果需要描边切图周围需要留出⼀点区域,我这个Shader提供了两个参数可以调整效果,检测范围和描边粗细,根据图⽚的不同,参数肯定要做些调整才能达到最想要的效果,Shader基于Unity⾃带SpriteDefault修改,直接赋给Sprite就⾏了。⼤家也可以适当做些修改。
  3D描边已经完成了法线膨胀的⽅法,接下来我会重点学习屏幕特效的⽅法然后写博客。以后还会有各种效果的Shader博客。
Shader "Sprites/SpriteOutline"
{
Properties
{
[PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
_Color ("Tint", Color) = (1,1,1,1)
[MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
_OutlineColor("OutlineColor",Color) = (1,1,1,1)
_CheckRange("CheckRange",Range(0,1)) = 0
_LineWidth("LineWidth",Float) = 0.39
_CheckAccuracy("CheckAccuracy",Range(0.1,0.99)) = 0.9
}
SubShader
{
Tags
{
"Queue"="Transparent"
"IgnoreProjector"="True"
"RenderType"="Transparent"
"PreviewType"="Plane"
"CanUseSpriteAtlas"="True"
}
Cull Off
Lighting Off
ZWrite Off
Blend One OneMinusSrcAlpha
Pass
{
  CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 2.0
#pragma multi_compile _ PIXELSNAP_ON
#pragma multi_compile _ ETC1_EXTERNAL_ALPHA
#include "inc"
sampler2D _MainTex;
float4 _MainTex_TexelSize;
sampler2D _AlphaTex;
fixed4 _Color;
fixed4 _OutlineColor;
float _CheckRange;
float _LineWidth;
float _CheckAccuracy;
struct appdata_t
{
float4 vertex  : POSITION;
float4 color    : COLOR;
float2 texcoord : TEXCOORD0;
};
struct v2f
{
float4 vertex  : SV_POSITION;
fixed4 color    : COLOR;
float2 texcoord  : TEXCOORD0;
};//
v2f vert(appdata_t IN)
{
v2f OUT;
OUT.vertex = UnityObjectToClipPos(IN.vertex);
#ifdef PIXELSNAP_ON
OUT.vertex = UnityPixelSnap (OUT.vertex);
#endif
return OUT;
}
fixed4 SampleSpriteTexture (float2 uv)
{
fixed4 color = tex2D (_MainTex, uv);
#if ETC1_EXTERNAL_ALPHA//
// get the color from an external texture (usecase: Alpha support for ETC1 on android)
color.a = tex2D (_AlphaTex, uv).r;
#endif//ETC1_EXTERNAL_ALPHA
return color;
}
fixed4 frag(v2f IN) : SV_Target
{
fixed4 c = SampleSpriteTexture (IN.texcoord) * IN.color;
float isOut = step(abs(1/_LineWidth),c.a);
if(isOut != 0)
{
fixed4 pixelUp = tex2D(_MainTex, IN.texcoord + fixed2(0, _MainTex_TexelSize.y*_CheckRange));                      fixed4 pixelDown = tex2D(_MainTex, IN.texcoord - fixed2(0, _MainTex_TexelSize.y*_CheckRange));                      fixed4 pixelRight = tex2D(_MainTex, IN.texcoord + fixed2(_MainTex_TexelSize.x*_CheckRange, 0));                      fixed4 pixelLeft = tex2D(_MainTex, IN.texcoord - fixed2(_MainTex_TexelSize.x*_CheckRange, 0));
float bOut = step((1-_CheckAccuracy),pixelUp.a*pixelDown.a*pixelRight.a*pixelLeft.a);
c = lerp(_OutlineColor,c,bOut);
return c;
}
return c;
}
ENDCG
}ps切图片
}
}