Unity Shader RGBA-Farb-Maske

Arbeite ich an einer shader-Einheit, in der ich die Farbe ändern möchten, basierend auf einem Bild mit der Maske. In diesem Bild mit der Maske, die RGB-Kanäle stehen für eine Farbe, die ausgewählt werden können, die in der shader. Die Idee hinter dem shader ist, dass es leicht zu ändern das Aussehen eines Objekts ändern und die textur von hand.

Shader "Custom/MultiColor" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _MaskTex ("Mask area (RGB)", 2D) = "black" {}
        _ColorR ("Red Color", Color) = (1,1,1,1)
        _ColorG ("Green Color", Color) = (1,1,1,1)
        _ColorB ("Blue Color", Color) = (1,1,1,1)
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Lambert

        sampler2D _MainTex;
        sampler2D _MaskTex;
        half4 _ColorR;
        half4 _ColorG;
        half4 _ColorB;
        half4 _MaskMult;

        struct Input {
            float2 uv_MainTex;
        };

        void surf (Input IN, inout SurfaceOutput o) {
            half4 main = tex2D (_MainTex, IN.uv_MainTex);
            half4 mask = tex2D (_MaskTex, IN.uv_MainTex);

            half3 cr = main.rgb * _ColorR;
            half3 cg = main.rgb * _ColorG;
            half3 cb = main.rgb * _ColorB;

            half r = mask.r;
            half g = mask.g;
            half b = mask.b;

            half minv = min(r + g + b, 1);

            half3 cf = lerp(lerp(cr, cg, g*(r+g)), cb, b*(r+g+b));
            half3 c = lerp(main.rgb, cf, minv);

            o.Albedo = c.rgb;
            o.Alpha = main.a;
        }
        ENDCG
    } 
    FallBack "Diffuse"
}

Das problem mit dem shader ist die Mischung zwischen dem maskierten Farbe auf der grün-und blau-Kanal. Zwischen definierten Farben in der Farbe supposted aus dem roten Bereich sichtbar ist. Unten ein Beispiel ist einsehbar.
Unity Shader RGBA-Farb-Maske

Die rote Farbe der roten Maske, grün durch die grüne Maske und desert yellow von den blauen Bereich. Ich weiß nicht, warum dies geschieht, oder wie dieses problem zu lösen.

InformationsquelleAutor Neok | 2015-01-22
Schreibe einen Kommentar