2017-03-15 1 views
0

enter image description hereRechercher et remplacer la couleur dans Texture2D/Sprite

Je voudrais changer la couleur du pantalon du bleu (# 0088f0) au rouge (# f00000) directement dans le code (c'est un sprite 2D).

Je beaucoup cherché mais n'a pas trouvé quelque chose de travailler avec un sprite sans recoloring pixels spécificités (setPixel()) .. ect ..

On ne peut pas simplement remplacer une couleur par une autre sur un sprite en quelque sorte? comme le rendu du RGB de BLUE est égal à RED par défaut pour ce sprite?

+1

vous pouvez teinter la couleur à l'intérieur de l'inspecteur des sprites. Mais pour avoir de bons résultats que vous auriez à faire ce pantalon blanc. –

+0

Ajouter nouveau matériel avec des couleurs .... –

Répondre

1

Vous pouvez obtenir ce que vous voulez avec l'utilisation de shaders. Vous devez créer un nouveau matériau, lui affecter du shader, puis affecter ce matériau au composant d'image sur la scène. Voici le code shader:

Shader "PiotrMitrega/ColorSwap" 
{ 
    Properties 
    { 
     _MainTex("Sprite", 2D) = "white" {} 
     _ColorToChange("Color You Want To Change", Color) = (0,0,1,1) 
     _DesiredColor("Desired Color ", Color) = (1,0,0,1) 
    } 
    SubShader 
    { 
     Tags 
     { 
      "RenderType" = "Opaque" 
      "Queue" = "Transparent+1" 
     } 

     Pass 
     { 
     ZWrite Off 
     Blend SrcAlpha OneMinusSrcAlpha 

     CGPROGRAM 
     #pragma vertex vert 
     #pragma fragment frag 
     #pragma multi_compile DUMMY PIXELSNAP_ON 

     sampler2D _MainTex; 
     float4 _ColorToChange; 
     float4 _DesiredColor; 

     struct Vertex 
     { 
      float4 vertex : POSITION; 
      float2 uv_MainTex : TEXCOORD0; 
      float2 uv2 : TEXCOORD1; 
     }; 

     struct Fragment 
     { 
      float4 vertex : POSITION; 
      float2 uv_MainTex : TEXCOORD0; 
      float2 uv2 : TEXCOORD1; 
     }; 

     Fragment vert(Vertex v) 
     { 
      Fragment o; 

      o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); 
      o.uv_MainTex = v.uv_MainTex; 
      o.uv2 = v.uv2; 

      return o; 
     } 

     float4 frag(Fragment IN) : COLOR 
     { 
      half4 c = tex2D(_MainTex, IN.uv_MainTex); 

       if (c.r >= _ColorToChange.r - 0.005 && c.r <= _ColorToChange.r + 0.005 
       && c.g >= _ColorToChange.g - 0.005 && c.g <= _ColorToChange.g + 0.005 
        && c.b >= _ColorToChange.b - 0.005 && c.b <= _ColorToChange.b + 0.005) 
      { 
       return _DesiredColor; 
      } 

      return c; 
     } 
      ENDCG 
     } 
    } 
} 

Je ne suis pas qualifié par écrit shaders, il peut certainement être écrit mieux que cela. Mais de toute façon, ça fait le boulot.

That's how you should setup this on the scene

Result of using shader

Cependant, vous pouvez le voir ne fonctionne pas sur les bords. C'est parce que ta texture est faite comme ça. Le corps, les jambes et la tête ne sont pas de couleur unie. Donc, il a échangé seulement sur une couleur particulière.

S'il vous plaît garder à l'esprit que si vous ne réglez le mode de filtre « Point » dans les paramètres d'importation de texture, vos bords seront encore plus floue (même si votre texture a des couleurs solides partout)

Donc, si vous avoir des couleurs solides partout sur votre texture, le shader fonctionnerait bien exactement comment il est. Mais, par exemple, la texture donnée (avec des bords flous) nous pourrions utiliser une autre approche. Nous pouvons définir manuellement les valeurs min/max pour les composants r, g, b séparément et échanger la couleur pour tout ce qui se trouve dans la plage désirée. est ici le code shader pour que:

Shader "PiotrMitrega/ColorSwap-Range" 
{ 
    Properties 
    { 
     _MainTex("Sprite", 2D) = "white" {} 
     _MinG("Minimum Green Value", Float) = 0.5 
     _MaxG("Maximum Green Value", Float) = 1 
     _MinB("Minimum Blue Value", Float) = 0.5 
     _MaxB("Maximum Blue Value", Float) = 1 
     _MinR("Minimum Red Value", Float) = 0.5 
     _MaxR("Maximum Red Value", Float) = 1 
     _DesiredColor("Desired Color ", Color) = (1,0,0,1) 
    } 
    SubShader 
    { 
     Tags 
     { 
      "RenderType" = "Opaque" 
      "Queue" = "Transparent+1" 
     } 

     Pass 
     { 
     ZWrite Off 
     Blend SrcAlpha OneMinusSrcAlpha 

     CGPROGRAM 
     #pragma vertex vert 
     #pragma fragment frag 
     #pragma multi_compile DUMMY PIXELSNAP_ON 

     sampler2D _MainTex; 
     float4 _DesiredColor; 
     float _MinG; 
     float _MaxG; 
     float _MinB; 
     float _MaxB; 
     float _MinR; 
     float _MaxR; 

     struct Vertex 
     { 
      float4 vertex : POSITION; 
      float2 uv_MainTex : TEXCOORD0; 
      float2 uv2 : TEXCOORD1; 
     }; 

     struct Fragment 
     { 
      float4 vertex : POSITION; 
      float2 uv_MainTex : TEXCOORD0; 
      float2 uv2 : TEXCOORD1; 
     }; 

     Fragment vert(Vertex v) 
     { 
      Fragment o; 

      o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); 
      o.uv_MainTex = v.uv_MainTex; 
      o.uv2 = v.uv2; 

      return o; 
     } 

     float4 frag(Fragment IN) : COLOR 
     { 
      half4 c = tex2D(_MainTex, IN.uv_MainTex); 
      if (c.g >= _MinG && c.g <= _MaxG 
       && c.r >= _MinR && c.r <= _MaxR 
       && c.b >= _MinB && c.b <= _MaxB) 
      { 
       return _DesiredColor; 
      } 

      return c; 
     } 
      ENDCG 
     } 
    } 
} 

En jouant un peu avec des valeurs min/max vous serez certainement en mesure d'obtenir l'effet désiré. Si vous voulez avoir quelques effets prédéfinis, comme "chemise rouge", "pantalon marron", etc, vous devez créer quelques matériaux, changer leurs paramètres pour répondre à vos besoins, puis les échanger en fonction de vos besoins actuels .

Hope it helps!