平時在ugui上添加上了材質(zhì)后,你再改變圖片的顏色就不會改變了,在自己的shader上改變顏色,所有使用這個shader的ui都改變顏色了,或者不再受mask的約束了。

mask無效
我們想要繼承iamge中的顏色控制,只需要在頂點函數(shù)中把頂點顏色傳遞給片元即可。
o.color=v.color;
然后再最后的顏色乘上傳遞過來的顏色值即可。這個即解決了繼承顏色,同時調(diào)整單個顏色也不會影響其他的物體。
當然我們平時使用代碼改變shader中的屬性的時候,不想要所有使用該shader的物體改變屬性,我們可以把這個物體上的材質(zhì)復(fù)制實例化一個新的材質(zhì),然后把新材質(zhì)賦值給物體然后改變shader屬性即可。具體做法:
var mat= GetComponent<Image>().material;
var newMat=(Material)Instantiate(mat);
GetComponent<Image>().material=newMat;
newMat.SetColor("_Color",Color.white);
然后就是實現(xiàn)遮罩效果,現(xiàn)在屬性中加這些:
/* UI Mask*/
[PerRendererData]_StencilComp ("Stencil Comparison", Float) = 8
[PerRendererData]_Stencil ("Stencil ID", Float) = 0
[PerRendererData]_StencilOp ("Stencil Operation", Float) = 0
[PerRendererData]_StencilWriteMask ("Stencil Write Mask", Float) = 255
[PerRendererData]_StencilReadMask ("Stencil Read Mask", Float) = 255
[PerRendererData]_ColorMask("Color Mask", Float) = 15
然后再SubShader中加這些:
/* UI Mask*/
Stencil
{
Ref [_Stencil]
Comp [_StencilComp]
Pass [_StencilOp]
ReadMask [_StencilReadMask]
WriteMask [_StencilWriteMask]
}
ColorMask[_ColorMask]
嗯差不多就是這個樣子,具體的原理猜測顏色是根據(jù)材質(zhì)的前后來選擇渲染的吧,然后我們寫的shader最后渲染然后就可以獲得吧。代碼