平時(shí)在ugui上添加上了材質(zhì)后侦香,你再改變圖片的顏色就不會(huì)改變了圾叼,在自己的shader上改變顏色,所有使用這個(gè)shader的ui都改變顏色了盛泡,或者不再受mask的約束了闷祥。
mask無效
我們想要繼承iamge中的顏色控制,只需要在頂點(diǎn)函數(shù)中把頂點(diǎn)顏色傳遞給片元即可傲诵。
o.color=v.color;
然后再最后的顏色乘上傳遞過來的顏色值即可凯砍。這個(gè)即解決了繼承顏色,同時(shí)調(diào)整單個(gè)顏色也不會(huì)影響其他的物體拴竹。
當(dāng)然我們平時(shí)使用代碼改變shader中的屬性的時(shí)候悟衩,不想要所有使用該shader的物體改變屬性,我們可以把這個(gè)物體上的材質(zhì)復(fù)制實(shí)例化一個(gè)新的材質(zhì)栓拜,然后把新材質(zhì)賦值給物體然后改變shader屬性即可座泳。具體做法:
var mat= GetComponent<Image>().material;
var newMat=(Material)Instantiate(mat);
GetComponent<Image>().material=newMat;
newMat.SetColor("_Color",Color.white);
然后就是實(shí)現(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]
嗯差不多就是這個(gè)樣子幕与,具體的原理猜測(cè)顏色是根據(jù)材質(zhì)的前后來選擇渲染的吧挑势,然后我們寫的shader最后渲染然后就可以獲得吧。代碼