Unity 2D外描边
一、前言
今天,我们来实现一个2D外描边的效果。外描边:即在边缘透明像素周围加上一层描边,不占用原来的像素。
思路:我们可以在片元着色器实现此效果,当一个像素本身不是透明的(alpha>0),那么让它返回自身的颜色;当一个像素本身是透明的,并且它上下左右4个像素的alpha值总和不等于0,那么我们可以判定该像素处于边缘,让它变成描边颜色就可以。
二、Shader内容
2.1 初版shader
好,我们根据思路来写代码
Shader "Custom/2DOutline"{
Properties{
_MainTex("Texture",2D) = "white" {}
_OutlineWidth("OutlineWidth",Range(0,10)) = 0
_OutlineColor("OutlineColor",Color) = (0,0,0,1)
}
SubShader{
Tags { "Queue" = "Transparent" "RenderType" = "Transparent"}
Pass{
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
Cull Off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};
sampler2D _MainTex;
float4 _MainTex_ST; //获取_MainTex纹理的Tiling和Offset,带入xyzw
float4 _MainTex_TexelSize;//获取_MainTex纹理的宽高,4个分量如下:Vector4(1 / width, 1 / height, width, height)
float _OutlineWidth;
float4 _OutlineColor;
//顶点着色器不做额外操作
v2f vert (appdata v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
//片元着色器
half4 frag(v2f v) : SV_Target{
fixed4 col = tex2D(_