模型各部位自定義顏色Shader
阿新 • • 發佈:2018-12-27
模型的各個部位可以更加需要更換不同的顏色。
大體思路:一張遮罩圖,這張圖中的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就能發散出很多的方法,有興趣的話自己可以試試,不明白的地方歡迎留言交流。。。