效果图:
原理:模板测试(Stencil Test)模板缓冲(StencilBuffer)
使用UI/Default的Stencil属性来实现的:Stencil可以用来设定像素的参考值,比较函数等
在渲染一个片元的时候:
1. 先读取模板缓冲区中的模板值(使用读取掩码(stencil Read Mask))
2. 读取该片元的参考值(reference value)(使用读取掩码(stencil Read Mask))
3. 使用比较函数比较这两个值(例如:片元参考值小于缓冲区的值时舍弃
4. 进行像素的取舍
5. 修改模板缓冲区(不管此片元有没有通过测试都可以修改)
参考文章:Stencil在Unity中的使用_unity stencil_阿斯提尼的博客-CSDN博客
官方文档:ShaderLab 命令:模板 - Unity 手册
Shader = UI/Default.shader 源码:https://github.com/TwoTailsGames/Unity-Built-in-Shaders/blob/master/DefaultResourcesExtra/UI/UI-Default.shader
操作:
- 按照示例图放置UI,背景bg,反遮罩unmask,遮罩mask(做了黑色半透明的效果)
- *注意,在 Hierarchy里反遮罩要在遮罩上面,即先渲染unmask,再渲染mask
- 创建两个材质:unmask,mask,使用的shader为Unity默认的UI/Default,挂载在对应UI上
Material的配置分别如下:
unmask:
StencilComparison = 0 :不画这一层的像素(因为只是用来做反遮罩,这一部分镂空就行)
StencilID = 1 :这一层的参考值为1,此image覆盖的像素(准确来说是片元)的stencil值都为1
StencilOperation = 2:将这参考值StencilId写入缓冲区(自此为止,这个image像素缓冲区对应的参考值就都为1了)