【Simple Shader】UGUI自带效果继承

平时在ugui上添加上了材质后,你再改变图片的颜色就不会改变了,在自己的shader上改变颜色,所有使用这个shader的ui都改变颜色了,或者不再受mask的约束了。


【Simple Shader】UGUI自带效果继承_第1张图片
mask无效

我们想要继承iamge中的颜色控制,只需要在顶点函数中把顶点颜色传递给片元即可。

o.color=v.color;

然后再最后的颜色乘上传递过来的颜色值即可。这个即解决了继承颜色,同时调整单个颜色也不会影响其他的物体。
当然我们平时使用代码改变shader中的属性的时候,不想要所有使用该shader的物体改变属性,我们可以把这个物体上的材质复制实例化一个新的材质,然后把新材质赋值给物体然后改变shader属性即可。具体做法:

var mat= GetComponent().material;
var newMat=(Material)Instantiate(mat); 
GetComponent().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最后渲染然后就可以获得吧。代码

你可能感兴趣的:(【Simple Shader】UGUI自带效果继承)