Image.materail木有共享问题(偷懒方法解决)

  近期在做一个项目,里边有将几十个Image置灰的操作,如果解锁,这个Image变回彩色的需求(最后贴上shader代码)

  我在获取image.materail的时候,本意是像meshrenderer一样获取它的materail,而不是sharematerail,但是当我

image.materail.SetFloat("_Lerp",0)置灰的时候,发现所有有这个材质的Image都会置灰,也就是这个image.materai就相当于meshrenderer.sharematerail

  我就在start的时候给每一个Image都new了一个materail,这样虽然把材质分开了,最大的问题是这些Image不能合批了,如果有几十个Image,那就增加几十个Batch,

这样肯定是不符合要求的。最后这样实在解决不了,我就只存下一份加载好的灰色材质,如果没有解锁,就给Image赋值这个材质,如果已经解锁,就将Image.material置

空,这样就只会增加一个Batch了

 两种颜色的变换

 这样又满足了颜色的变化,又不增加Batch,达到要求。

这是我的shader代码

Shader "Custom/GrayToColor"
{
Properties
{
// 主图
_MainTex("Albedo (RGB)", 2D) = "white" {}
// 插值
_Lerp("Color Lerp",Range(0,1.0)) = 0
}
SubShader
{
// 标签
Tags {"Queue" = "Transparent" "IgnoreProjector" = "true" "RenderType" = "Transparent"}

ZWrite On
Blend SrcAlpha OneMinusSrcAlpha
Cull Off

LOD 100

pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag

#include "UnityCG.cginc"

struct appdata {

float4 vertex: POSITION;
float2 uv:TEXCOORD0;
fixed4 color : COLOR;

};

struct v2f {

float2 uv:TEXCOORD0;
float4 vertex:SV_POSITION;
fixed4 color : COLOR;
};

sampler2D _MainTex;
float4 _MainTex_ST;
float _Lerp;

v2f vert(appdata v) {

v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv,_MainTex);
o.color = v.color;

return o;
}


fixed4 frag(v2f i) :SV_Target{

// 主图颜色
fixed4 renderTex = tex2D(_MainTex,i.uv);

// 灰度 上面的参考灰度 可以比对效果
//fixed gray = 0.2125*renderTex.r + 0.7154*renderTex.g + 0.0721*renderTex.b;
fixed gray = 0.30 * renderTex.r + 0.59 * renderTex.g + 0.11 * renderTex.b;
// 灰度颜色
fixed3 grayLerp = fixed3(gray,gray,gray);
// 插值灰度变彩色
fixed3 finalColor = lerp(grayLerp,renderTex.rgb,_Lerp);

// 最终颜色
return fixed4(finalColor, renderTex.a);

}


ENDCG

}

}
FallBack "Diffuse"
}

温故知新,方便自己回顾使用
原文地址:https://www.cnblogs.com/zjka/p/13306133.html