近期在做一个项目,里边有将几十个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"
}