1.问题描述
一个模型本体可以半透明的轮廓描边,如图:
2.通常轮廓描边的解决方式
一般接方式有两种
1.通过顶点本地坐标或者顶点法向量方向向外拓展,形成描边。
此种方式效率高,主要问题在于模型本身必须是不透明的,否则会穿帮。还有就是由于没有模糊处理,会有一些突兀。
2.后处理的方式,将深度图写入深度缓存,然后使用图像处理技术滤波,找到边缘区域,然后模糊处理,形成描边。
此种方式优点在于对模型本身不透明度没有任何限制,并且边缘效果非常好,缺点在于性能消耗大,手机平台不太适用,主要用于主机或者PC平台。
3.使用模板对比的方式描边
过程如下:
Pass 1.正常渲染模型,同时强制将模型像素数据写入模板缓存。Unity Shader关键代码如下:
Cull Back
ZWrite On
Blend SrcAlpha OneMinusSrcAlpha
ColorMask RGBA
Stencil {
Ref[_Stencil]
Comp Always
Pass Replace
ZFail Replace
ReadMask[_StencilReadMask]
WriteMask[_StencilWriteMask]
}
Pass 2:将顶点和法线向正方向拓展,然后模板对比,不一样的区域可以写入轮廓边颜色。
Pass 3:将顶点和法线向负方向拓展,然后模板对比,不一样的区域可以写入轮廓边颜色。
Pass 2,3 关键代码如下:
Cull Off ZWrite On ZTest Always ColorMask RGBA Stencil { Ref [_Stencil] Comp NotEqual Pass Keep ZFail Keep ReadMask[_StencilReadMask] WriteMask[_StencilWriteMask] }
最终效果图如问题描述的图所示,在手机上用起来效率还行。