1. 程式人生 > >模型各部位自定義顏色Shader

模型各部位自定義顏色Shader

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