一、模型描边的原理
模型描边的原理是通过将模型进行轮廓检测,然后在轮廓线上绘制一条边缘线,从而实现模型描边的效果。在 Cocos Creator 中,可使用 shader 实现模型描边。
二、实现模型描边的 shader
在 Unity中,可以通过创建一个新的材质来实现模型描边的效果。首先,在项目资源管理器中创建一个新的 shader,然后在 shader 中添加以下代码:
Shader "Custom/Outline" {
Properties {
_Color ("Color", Color) = (1,1,1,1)
_OutlineColor ("Outline Color", Color) = (0,0,0,1)
_OutlineWidth ("Outline Width", Range(0.0, 0.1)) = 0.01
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 100
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata {
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct v2f {
float4 vertex : SV_POSITION;
float3 normal : NORMAL;
float4 color : COLOR;
};
float _OutlineWidth;
v2f vert (appdata v) {
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.normal = UnityObjectToWorldNormal(v.normal);
o.color = _Color;
return o;
}
fixed4 _OutlineColor;
fixed4 frag (v2f i) : SV_Target {
fixed4 col = i.color;
float2 uv = i.vertex.xy / i.vertex.w;
float4 ddx = ddx(i.vertex);
float4 ddy = ddy(i.vertex);
float2 edge = float2(_OutlineWidth, _OutlineWidth) * (ddx.yz + ddy.yz);
float4 outline = tex2D(_CameraDepthTexture, uv);
outline.a = 1.0;
outline.rgb = _OutlineColor.rgb;
outline.a *= step(outline.r, 1.0 - edge.x);
outline.a *= step(outline.r, edge.y);
col = lerp(outline, col, col.a);
return col;
}
ENDCG
}
}
FallBack "Diffuse"
}
在代码中,首先定义了三个属性:_Color、_OutlineColor 和 _OutlineWidth。_Color 表示模型的颜色,_OutlineColor 表示描边的颜色,_OutlineWidth 表示描边的宽度。
然后在 Pass 中定义了两个结构体:appdata 和 v2f。appdata 表示输入的顶点数据,v2f 表示输出的顶点数据。在 vert 函数中,将输入的顶点数据转换为输出的顶点数据,并将 _Color 赋值给输出的顶点数据的 color 属性。
在 frag 函数中,首先将输入的顶点数据转换为屏幕坐标系中的坐标,并计算出轮廓线的宽度。然后通过 tex2D 函数获取深度图中的像素值,并将其赋值给 outline 变量。接着,通过 step 函数计算出轮廓线的位置,并将其赋值给 outline 的 alpha 属性。最后,通过 lerp 函数将描边的颜色与模型的颜色进行插值,从而实现模型描边的效果。
三、使用 shader 实现模型描边
在 Cocos Creator 中,可以通过创建一个新的材质来使用 shader 实现模型描边。首先,在项目资源管理器中创建一个新的材质,然后将刚才创建的 shader 赋值给材质的 shader 属性。接着,将模型的材质替换为新创建的材质,即可实现模型描边的效果。