基于模板测试的透视描边效果
自定义模板缓冲显示被墙体遮挡的角色
Github源码传送门————>OverlayEffectThroughWalls
Bilibili教程传送门————>小祥带你实现露娜探测箭穿墙透视高亮效果

实现思路
通过实机画面可以看到,射出探测箭之后被扫描到的玩家轮廓像UI一样被高亮显示在画面上,相当于是在人物模型处加一个遮罩,后处理阶段对加了遮罩的区域进行指定效果的绘制,那么这种效果一般是用模板测试来做,通过写入模板值的方式指示哪些区域或者说像素需要进行后续处理。模板测试和深度测试都是GPU维护的缓冲区进行操作,性能非常好但是读写易用性就没那么好了,这次我们使用贴图自定义模板缓冲来实现这个效果。思路是所有被扫描到的人物模型对应的像素区域写入指定模板值到纹理,通过模板值来区分不同类型的人物的轮廓,后处理阶段以这张写入模板值的纹理作为遮罩进行绘制操作,比如在人物轮廓填充对应的高亮颜色然后添加外描边等等。
OverlayEffectRenderPass.cs
1 | |
- 纹理只存模板值所以格式设置为R8_UInt单通道
- 创建渲染队列,指定ShaderTagId为我们写入模板值的Pass对应的LightMode
- 清空之前的深度测试和模板测试的值,提交渲染队列进行渲染
- 因为使用了单通道纹理,所以绘制结束之后将写有模板值的纹理设置为全局纹理以供后处理的时候使用
- 后续Blit调用后处理材质对画面进行处理
WriteStencil.shader
1 | |
- 这个Pass添加到需要透视高亮效果的模型对应的材质shader中
- 模型可能会有重叠的时候,前面提交渲染队列之前清空了深度值,这里需要开启深度测试,保证写入的模板值是最前面模型的
- 顶点着色器方法中正常进行顶点变换,片元着色器方法中只需要返回一个模板值即可
OverlayOutline.shader
1 | |
- 声明创建的单通道纹理StencilTexture,这种纹理需要通过Load方法来进行采样,将uv坐标乘上纹理的宽高得到像素坐标进行采样得到前一步写入的模板值
- 如果模板值为0说明不是需要处理的像素直接跳过即可
- 通过写入的不同模板值选择对应的外描边颜色
- 做一个简单的边缘检测,如果是边缘就返回外描边颜色,否则返回填充颜色
OverlayEffectController.cs
1 | |
- 通过MPB将不同角色对应的模板值传递到shader中
- 调用SetShaderPassEnabled方法,在模型被扫描到的开启pass写入模板值,后处理的时候自然会将当前模型的高亮轮廓绘制出来
完结撒花~

基于模板测试的透视描边效果
https://baifabaiquan.cn/2025/10/24/OverlayEffectThroughWalls/