实现效果如下,描边是要克隆一个自身物体充当描边的,利用模板测试扣掉中间的描边色



Selected材质给指定物体的渲染空间写入模板值2
cs
Shader "Custom/Selected"
{
Properties
{
_Color("Color", Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Transparent" "Queue"="Transparent" }
LOD 100
Pass
{
ZWrite Off
ZTest Always
Stencil
{
Ref 2
Comp Always //总是通过模板测试
Pass Replace //通过模板测试后进行替换操作(将Ref的值写入模板缓冲区)
}
ColorMask 0
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
};
struct v2f
{
float4 vertex : SV_POSITION;
};
float4 _Color;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
return fixed4(0,0,0,0);
}
ENDCG
}
}
}
Outline材质给指定物体的克隆体(放大克隆体)上纯色(任意颜色),并且非2模板值范围才渲染,形成描边,克隆体越大描边越大,也就是只有本体会被渲染出来,克隆体只有本体以外的部分渲染,本体和克隆体的位置、旋转都要保持一致(可将克隆体放到本体节点下)
cs
shader "Custom/Outline"
{
Properties
{
_Color("Color", Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Transparent" "Queue"="Transparent" }
LOD 100
Pass
{
ZTest Always
ZWrite Off
Stencil
{
Ref 2
Comp NotEqual //不等于2的才渲染(即只渲染外边框) Selected材质球(麻将本身)会写入2到模板缓冲区
Pass keep
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
};
struct v2f
{
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
float4 _Color;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
return _Color;
}
ENDCG
}
}
}