描边
法线挤出描边法:
使用两个Pass,第1个Pass把顶点向法线方向挤出作为阴影,第2个Pass正常渲染。
优点:
简单。
问题:
容易出现边缘异常、断裂、距离相机越远描边越小的问题。
Shader "Tut/Shader/Toon/Outline_1"{
properties{
_Outline("Outline", range(0,0.2)) = 0.2
}
SubShader{
Pass{
Tags{
"LightMode"="Always"}
Cull Off
ZWrite Off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float _Outline;
struct v2f{
float4 pos:SV_POSITION;
};
v2f vert(appdata_full v){
v2f o;
v.vertex.xyz += v.normal * _Outline;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
return o;
}
float4 frag(v2f i):COLOR{
float4 c = 0;
return c;
}
ENDCG
}
Pass{
Tags("LightMode"="ForwardBase")
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float4 _LightColor0;
struct v2f{
float4 pos:SV_POSITION;
}
v2f vert(appdata_full v){
v2f o;
o.pos=mul(UNITY_MATRIX_MVP, v.vertex);
return o;
}
float4 frag(v2f i):COLOR{
return float4(1,1,1,1);
}
}
}
}
视空间法线挤出法
:在视角空间下沿着法线方向挤出。
优点:
解决了描边出错、距离相机距离越远描边越小的问题。
问题:
依然没有解决描边断裂的问题。
Pass{
Tags{
"LightMode"="Always"}
Cull Front
ZWrite On
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float _Outline;
struct v2f{
float4 pos:SV_POSITION;
}
v2f vert (appdata_full v)