算法很简单,主要需要不同观察角度看上去线的宽度一样,需要转换到观察空间进行操作,空间变换请看我上一篇博客。
需要两个pass,一个画线,一个填充
Shader "Custom/Outline"
{
Properties
{
_OutlineVal("Outline value", Range(0., 2.)) = 1. //描线的宽度
_OutlineCol("Outline color", color) = (1., 1., 1., 1.)
}
SubShader
{
Tags{ "Queue" = "Geometry" "RenderType" = "Opaque" }
Pass
{
Cull Front
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f {
float4 pos : SV_POSITION;
};
float _OutlineVal;
v2f vert(appdata_base v) {
v2f o;
o.pos = mul(UNITY_MATRIX_MV, v.vertex); //注意这里只换算到观察空间,还没有到裁剪空间
float3 normal = mul((float3x3) UNITY_MATRIX_IT_MV, v.normal); //上一篇博客说过,法线的变换需要用到UNITY_MATRIX_IT_MV
o.pos.xy += _OutlineVal*normal.xy; //观察空间里xy方向始终和最终屏幕方