pass1:
v.vertex.xyz += v.normal * _Outer;
边缘沿着法向量延伸
Pass
{
blend SrcAlpha OneMinusSrcAlpha
zwrite off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float _Scale;
float _Outer;
struct v2f
{
float4 pos:POSITION;
float3 normal:TEXCOORD0;
float4 vertex:TEXCOORD1;
};
v2f vert (appdata_base v)
{
v.vertex.xyz += v.normal * _Outer;
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
o.normal = v.normal;
o.vertex = v.vertex;
return o;
}
fixed4 frag (v2f IN) : COLOR
{
// float3 N = mul(float4(IN.normal,0),_World2Object).xyz;
float3 N = normalize(mul(IN.normal,(float3x3)_World2Object));
float3 V = normalize(WorldSpaceViewDir(IN.vertex));
float bright = saturate(dot(N,V));
fixed4 col = fixed4(1,1,1,1);
col.a *= pow(bright,_Scale);
return col;
}
ENDCG
}
得到:
添加内部纯白
pass2
Pass
{
zwrite off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float _Scale;
float _Outer;
struct v2f
{
float4 pos:POSITION;
};
v2f vert (appdata_base v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
return o;
}
fixed4 frag (v2f IN) : COLOR
{
return fixed4(1,1,1,1);
}
ENDCG
}
加上
//上面的颜色减掉现在的颜色
blendop Sub
blend one SrcColor
得到 pass2
//内部的纯白
Pass
{
//上面的颜色减掉现在的颜色
blendop Sub
blend one SrcColor
zwrite off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float _Scale;
float _Outer;
struct v2f
{
float4 pos:POSITION;
};
v2f vert (appdata_base v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
return o;
}
fixed4 frag (v2f IN) : COLOR
{
return fixed4(1,1,1,1);
}
ENDCG
}
加上pass3:
Pass
{
blend SrcAlpha OneMinusSrcAlpha
zwrite off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float _Scale;
struct v2f
{
float4 pos:POSITION;
float3 normal:TEXCOORD0;
float4 vertex:TEXCOORD1;
};
v2f vert (appdata_base v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
o.normal = v.normal;
o.vertex = v.vertex;
return o;
}
fixed4 frag (v2f IN) : COLOR
{
// float3 N = mul(float4(IN.normal,0),_World2Object).xyz;
float3 N = normalize(mul(IN.normal,(float3x3)_World2Object));
float3 V = normalize(WorldSpaceViewDir(IN.vertex));
float bright = 1- saturate(dot(N,V));
return fixed4(1,1,1,1)*pow(bright,_Scale);
}
ENDCG
}