背景
第三人称游戏,特别是ARPG中,主角有时会被一些场景物件或者其他NPC遮挡,此时有几种常见的处理方法:
1.遮挡物直接剔除
2.遮挡物半透
3.主角虽然被遮挡但是能看到一圈轮廓
此文章主要介绍第三种实现方式,消耗仅为1个DrawCall,而且实现方法也很方便。
ZTest
首先需要简单介绍下ZTest,一般的渲染顺序为 不透明物体从前往后渲染-》透明物体从后往前渲染,在渲染时会牵涉到深度排序,也就是ZTest和ZWrite,为了提升性能,只要在片段着色器里没有AlphaTest的情况下,都会使用Early-Z技术,就是在光栅化阶段后,片段着色器前,进行ZTest,在Unity中,默认使用的是
ZTest LEqual
当渲染的片元深度值小于当前深度缓冲中的值时才会被渲染,不然会被剔除。
关于渲染顺序、深度排序等详细知识本文不做赘述。
示例展示
圆柱体代表我们的主角,方块代表场景物件,未被遮挡时可以看到主角的全貌(废话!)。
此时主角被场景物件遮挡,导致看不全。
加入X光效果后,我们看到圆柱体被遮挡的部分出现了一圈X光效果。