模型的各个部位可以更加需要更换不同的颜色。
大体思路:一张遮罩图,这张图中的rgb颜色各代表不同的部位。然后
把遮罩颜色和主纹理颜色混合。具体Shader代码如下:
Shader "Custom/MyCustomColors" {
Properties {
_MainTex ("Texture", 2D) = "white" {} //主纹理
_MaskTex ("MaskTex (RGBA)", 2D) = "black" {} //遮罩纹理
_BumpMap ("Bumpmap", 2D) = "bump" {} //法线贴图
_EyeColor ("Eye Color", Color) = (0.5,0.5,0.5,1) //眼睛颜色
_SkinColor ("Skin Color", Color) = (0.5,0.5,0.5,1) //皮肤颜色
_HairColor ("Hair Color", Color) = (0.5,0.5,0.5,1) //头发颜色
}
SubShader {
Tags { "RenderType"="Opaque" }
CGPROGRAM
#pragma surface surf HalfLambert nolightmap
//半兰伯特光照模型
half4 LightingHalfLambert (SurfaceOutput s, half3 lightDir, half atten) {
half NdotL = dot (s.Normal, lightDir);
half diff = NdotL * 0.5 + 0.5;
half4 c;
c.rgb = s.Albedo * _LightColor0.rgb * (diff * atten * 2);
c.a = s.Alpha;
return c;
}
sampler2D _MainTex;
sampler2D _BumpMap;
sampler2D _MaskTex;
float4 _EyeColor;
float4 _SkinColor;
float4 _HairColor;
float4 _AccentColor;
struct Input {
float2 uv_MainTex;
float2 uv_BumpMap;
};
void surf (Input IN, inout SurfaceOutput o) {
float4 basecol=tex2D(_MainTex,IN.uv_MainTex); //主纹理采样
float4 maskcol=tex2D(_MaskTex,IN.uv_MainTex); //遮罩纹理采样
float3 newcol;
//遮罩纹理r通道代表眼睛颜色
if(maskcol.r>0)
{
newcol = basecol * 2 * _EyeColor.rgb;
basecol.rgb = lerp(basecol,newcol,maskcol.r);
}
//遮罩纹理g通道代表皮肤颜色
if (maskcol.g > 0)
{
newcol = basecol * 2 * _SkinColor.rgb;
basecol.rgb = lerp(basecol,newcol,maskcol.g);
}
//遮罩纹理b通道代表头发颜色
if (maskcol.b > 0)
{
newcol = basecol * 2 * _HairColor.rgb;
basecol.rgb = lerp(basecol,newcol,maskcol.b);
}
o.Albedo = basecol;
//法线贴图
o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
o.Gloss = basecol.a;
o.Specular = basecol.a;
}
ENDCG
}
FallBack "Diffuse"
}
其实rgb只能代表有限个部位,但是我们可以用特定颜色代表特定部位,比方说(1,1,1,1)代表头发等等,这样就能够代表很多部位了,当然,还可以把每个部位的遮罩图拆开分别叠加,这样不光能换颜色,还能换各部位的纹理。这样更加这个Shader就能发散出很多的方法,有兴趣的话自己可以试试,不明白的地方欢迎留言交流。。。