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.
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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Best guess: anti-aliasing oder Bild-Kompression. Aliasing (auf das putzen mit), führen zu einer überlagerung der Farbkanäle, wodurch Sie zu mischen. Die Kompression arbeitet in der Regel durch Mittelwertbildung jedes pixels color-info basierend auf den Farben um ihn herum (jpeg ist besonders berüchtigt für diese).
Beheben, indem eine gerade pixel-basierte Pinsel (kein aliasing, keine abgerundeten Kanten) in Photoshop (oder was auch immer image suite, die Sie nutzen) und/oder versuchen Sie, die Farben, die durch Ihre shader und sehen, wie Sie mix - tun Sie entweder, sollten Sie eine bessere Idee von, was Los ist unter der Haube. Dies kombiniert mit einer verlustfreien/unkomprimierten Bild-Typ, wie .tga sollte helfen, aber Sie können mehr Speicher.