Unity UI Unmask 新手引导适用(新手项,有示例工程,不写代码/shader,帮助理解)

效果图:

原理:模板测试(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

操作:

  1. 按照示例图放置UI,背景bg,反遮罩unmask,遮罩mask(做了黑色半透明的效果)
  2. *注意,在 Hierarchy里反遮罩要在遮罩上面,即先渲染unmask,再渲染mask
  3. 创建两个材质:unmask,mask,使用的shader为Unity默认的UI/Default,挂载在对应UI上

Material的配置分别如下:

unmask:

StencilComparison = 0 :不画这一层的像素(因为只是用来做反遮罩,这一部分镂空就行)

StencilID = 1 :这一层的参考值为1,此image覆盖的像素(准确来说是片元)的stencil值都为1

StencilOperation = 2:将这参考值StencilId写入缓冲区(自此为止,这个image像素缓冲区对应的参考值就都为1了)

StencilComparison = 3:在画这一层的像素时,只有在 参考值等于模板缓冲区中的当前值时渲染像素
StencilID = 0 :这一层的参考值为0,这一层的像素0去与缓冲区的值比较
StencilOperation = 0:不对缓冲区的值进行修改
可以看到,当前的mask是黑色的遮罩, 缓冲区中间一块值为1,和参考值0不相等,所以这一块的像素就舍弃掉了;而 四周的参考值都为0,与本层的参考值0相等,所以通过的模板测试,故四周的黑色遮罩画出来了。
于是就实现了反遮罩的效果。
*比较函数StencilComparison的值为 7(StencilID >= buffer值时通过)也能实现一样的效果,实际设置可以自己根据需求修改

猜你喜欢

转载自blog.csdn.net/weixin_40695640/article/details/132526694
今日推荐