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方法。