Unity 模型本体半透明 轮廓描边


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]            }

最终效果图如问题描述的图所示,在手机上用起来效率还行。

4.代码链接如下

GitHub源码链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容