• 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"
    }

    温故知新,方便自己回顾使用
  • 相关阅读:
    java集合-方法
    Java线程池
    java疯狂讲义第18章类的加载和反射
    java疯狂讲义第16章多线程
    JAVA集合-HashMap的实现原理
    类加载-java new一个对象的过程发生了什么/Java对象创建过程
    JVM-java垃圾回收
    JVM-java内存区域
    JVM-java堆-新生代和老年代
    448. 找到所有数组中消失的数字
  • 原文地址:https://www.cnblogs.com/zjka/p/13306133.html
Copyright © 2020-2023  润新知