效果如下,有需要的朋友就往下看看吧
這是一個在描邊shader的基礎上做的改善,都知道的描邊材質主要的實現的方式是模型往法線方向往外擴展一定的寬度,形成描邊,但是這樣的操作就使得描邊的寬度是一定的,就不是很符合筆繪製的樣子,這裏需要做到描邊的寬度是有漸變效果的
改良後代碼如下
Shader "Unlit/NormalShader"
{
Properties
{
_MainTex("Texture", 2D) = "white" {}
_Size("Size",float) = 0
_Color("color",Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType" = "Opaque" }
LOD 100
Pass
{
Blend SrcAlpha OneMinusSrcAlpha
cull front
//Zwrite off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float3 normal:NORMAL;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float3 col : COLOR;
};
sampler2D _MainTex;
float4 _MainTex_ST;
float _Size;
float4 _Color;
v2f vert(appdata v)
{
v2f o;
float4 Vpos = mul(UNITY_MATRIX_MV,v.vertex);
float3 Vnormal = mul(UNITY_MATRIX_IT_MV,v.normal);
Vnormal.z = -0.05;
o.col = v.vertex.xyz/ v.vertex.w;
o.vertex = mul(UNITY_MATRIX_P,Vpos + float4(Vnormal,0) * (_Size*sin((o.col.z + o.col.x + o.col.y) *10) / 10 + 0.005f));
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag(v2f i) : SV_Target
{
return _Color;// fixed4(0.71f,0.549f,0.396f,1);
}
ENDCG
}
}
}
我這裏做的修改主要是兩句代碼
o.col = v.vertex.xyz/ v.vertex.w;
o.vertex = mul(UNITY_MATRIX_P,Vpos + float4(Vnormal,0) * (_Size*sin((o.col.z + o.col.x + o.col.y) *10) / 10 + 0.005f));
可以看出來,我這裏的操作只有一個目的,就是根據模型頂點的座標值來設定往外擴展的寬度,用到了正弦是爲了有一個漸變的過程。