使自定义的Shader支持Mask裁剪 您所在的位置:网站首页 unity的mask 使自定义的Shader支持Mask裁剪

使自定义的Shader支持Mask裁剪

2024-04-23 16:29| 来源: 网络整理| 查看: 265

昨天写了一篇技术博客,一时手痒,把之前解决过的问题也拿出来分享一下吧

还是别的项目组遇到了一个问题,他们找了一个Shader,但是发现这个Shader不能被UGUI的Mask所裁剪,网上搜索了一下解决方案,不过是英文的,这里搬运并翻译一下。

Unity论坛原文: http://answers.unity3d.com/questions/980924/ui-mask-with-shader.html

关键代码 在Properties中增加以下代码

Shader "xxxxxx" { Properties { ...... //MASK SUPPORT ADD _StencilComp ("Stencil Comparison", Float) = 8 _Stencil ("Stencil ID", Float) = 0 _StencilOp ("Stencil Operation", Float) = 0 _StencilWriteMask ("Stencil Write Mask", Float) = 255 _StencilReadMask ("Stencil Read Mask", Float) = 255 _ColorMask ("Color Mask", Float) = 15 //MASK SUPPORT END } }

在SubShader中增加以下代码

SubShader { Tags {...} //MASK SUPPORT ADD Stencil { Ref [_Stencil] Comp [_StencilComp] Pass [_StencilOp] ReadMask [_StencilReadMask] WriteMask [_StencilWriteMask] } ColorMask [_ColorMask] //MASK SUPPORT END ...... }

在你的 Shader 中加入这2段代码,剩下的部分照旧。这时我们再把这个 Shader 赋给 UGUI 组件的时候,就发现 mask 组件可以正确的剔除被我们更换过材质球的组件了。

PS:其实Mask的主要功能,计算都在UI组件上了,加上这2段以后,我们就可以正确的接受外部传入进来的Mask相关参数了,剩下的就是把它们剔除掉就好了。

补充一下:在支持Mask之后,在Mask组件下的Image等组件的Material只有第一次赋值有效,如果想要能动态修改的话,就要新建一个脚本继承Image并重写 GetModifiedMaterial 方法。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有