我正在为 Unity 开发一个着色器,我想在其中根据蒙版图像更改颜色。在此蒙版图像中,RGB 通道代表可以在着色器中选择的颜色。着色器背后的想法是无需手动更改纹理即可轻松更改对象的外观。
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"
}
着色器的问题是基于绿色和蓝色通道的遮罩颜色之间的混合。在假定来自红色区域的颜色中定义的颜色之间是可见的。下面的示例是可见的。
红色由红色蒙版创建,绿色由绿色蒙版创建,沙漠黄色由蓝色区域创建。我不知道为什么会这样或如何解决这个问题。
最佳猜测:抗锯齿或图像压缩。混叠(在您使用的画笔上)会导致颜色通道重叠,导致它们混合。压缩通常通过根据每个像素周围的颜色平均每个像素的颜色信息来工作(jpeg 在这方面尤其臭名昭著)。
在 Photoshop(或您正在使用的任何图像套件)中使用基于像素的笔刷(无锯齿,无圆角边缘)进行故障排除和/或尝试通过着色器更改颜色并查看它们如何混合 - 做任何一个应该给你更好地了解引擎盖下发生的事情。这与无损/未压缩的图像类型相结合,例如 .tga 应该有所帮助,尽管它们可能会使用更多内存。