由于“近大远小”效应,如果描边大小是统一的。那样就会导致人物走到近处时边缘就太大了(这个时候应该动态缩减)下面提供一个算法:
v2f vert (appdata v)
{
float4 projPos = UnityObjectToClipPos(v.pos);
float4 viewSpacePos = mul(UNITY_MATRIX_MV, v.pos);
float4 projNormal = normalize(UnityObjectToClipPos(float4(v.normal,1)));
//在viewspace中计算到相机的距离,代替深度图(消耗极大)
float distanceToCamera = length(viewSpacePos);
//人为规定的一个人物活动范围区间,这里定下的是离相机2到6米
distanceToCamera = clamp(distanceToCamera, 2, 6);
//将数据正规化为0-1区间。smoothstep将返回一个0 到1 的值,该值表示参数在最小值和最大值之间的成比例距离。
float distanceVal = smoothstep(2, 6, distanceToCamera);
//将距离作为边缘线框的权值
float normalScale = _EdgeThickness * (distanceVal *_EdgeThicknessControlMin + (1- distanceVal)*_EdgeThicknessControlMax*0.1);//_EdgeThickness *lerp(_EdgeThicknessControlMin, _EdgeThicknessControlMax, distanceToCamera)+ step(0.5, distanceToCamera)*2;
v2f o;
// o.pos = projPos + normalScale * projNormal;
o.pos = UnityObjectToClipPos(float4(v.pos.xyz + v.normal*normalScale, 1));
o.uv = v.uv.xy;
return o;
}