unity论坛原文:
http://answers.unity3d.com/questions/980924/ui-mask-with-shader.html
关键的支持代码:
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
{
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方法。