使用Graphics.Blit更改Sprite的颜色

发布时间 2023-05-31 18:52:22作者: 数学天才琪露诺

原理 :

利用public static void Blit (Texture source, Material mat, int pass= -1); 的mat参数:对材质的着色器进行后处理,来达到更改颜色的效果。

使用:

image

需要更改qunzi_2的颜色,更改颜色为随机,只需要提供sprite和材质球即可,效果如下:

image

C#代码:

   #region 更换Sprite的颜色

    public static Sprite ChangeSpriteColor(this Sprite sprite, Color newColor, Material mat)
    {
        // 获取 Sprite 的 Texture2D
        Texture2D texture2D = sprite.texture;
        // 将 Sprite 的 Texture2D 赋值给材质球的 _MainTex 属性
        mat.SetTexture("_MainTex", texture2D);
        // 设置需要替换的颜色
        mat.SetColor("_Color", newColor);
        // 创建 RenderTexture
        RenderTexture renderTexture = new RenderTexture(texture2D.width, texture2D.height, depth: 0);
        // 使用 Graphics.Blit 进行渲染
        Graphics.Blit(texture2D, renderTexture, mat);
        // 创建新的Sprite
        Rect rect = new Rect(0, 0, texture2D.width, texture2D.height);
        Sprite newSprite = Sprite.Create(renderTexture.ToTexture2D(),
            rect,
            new Vector2(0.5f, 0.5f),
            sprite.pixelsPerUnit,
            0,
            SpriteMeshType.FullRect);
        return newSprite;
    }

    #endregion

shader代码

 Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Color("_Color : 设置衣服的颜色,在没有上色步骤时使用", Color) = (1, 1, 1, 1)
        ...
    }
    ...
      fixed4 frag(v2f i) : SV_Target
            {
                //直接输出传入的颜色即可
                fixed4 col = tex2D(_MainTex, i.uv);
                col.rgb *= _Color;
                return col;
            }
            ...