平时在ugui上添加上了材质后,你再改变图片的颜色就不会改变了,在自己的shader上改变颜色,所有使用这个shader的ui都改变颜色了,或者不再受mask的约束了。
mask无效
我们想要继承iamge中的颜色控制,只需要在顶点函数中把顶点颜色传递给片元即可。
o.color=v.color;
然后再最后的颜色乘上传递过来的颜色值即可。这个即解决了继承颜色,同时调整单个颜色也不会影响其他的物体。
当然我们平时使用代码改变shader中的属性的时候,不想要所有使用该shader的物体改变属性,我们可以把这个物体上的材质复制实例化一个新的材质,然后把新材质赋值给物体然后改变shader属性即可。具体做法:
var mat= GetComponent<Image>().material;
var newMat=(Material)Instantiate(mat);
GetComponent<Image>().material=newMat;
newMat.SetColor("_Color",Color.white);
然后就是实现遮罩效果,现在属性中加这些:
/* 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]
嗯差不多就是这个样子,具体的原理猜测颜色是根据材质的前后来选择渲染的吧,然后我们写的shader最后渲染然后就可以获得吧。代码
网友评论