模型各部位自定义颜色Shader

20 篇文章 5 订阅

模型的各个部位可以更加需要更换不同的颜色。
大体思路:一张遮罩图这里写图片描述,这张图中的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就能发散出很多的方法,有兴趣的话自己可以试试,不明白的地方欢迎留言交流。。。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值