介绍

  • 经常会遇到需要对模型进行染色的需求,比如说衣服、头发、皮肤等等。这些染色的需求,我们可以通过贴图的单个通道多套mask区域来实现,通道相对比较有限,而结合纹理绑定的uv.x区间需要超出1,这部分区域我们不再混合颜色,而是直接对原纹理进行采样

Shader代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//染色核心代码 根据 R,G,B 通道混合算法
float3 diffuseColor1 =
(_ColorR.rgb * texColor.r * _ColorR.a +
_ColorG.rgb * texColor.g * _ColorG.a +
_ColorB.rgb * texColor.b * _ColorB.a) * _Color.rgb * float(8);

float2 newuv= float2(i.uv0.x-1, i.uv0.y);
float4 newColor = tex2D(_MainTex,TRANSFORM_TEX(newuv, _MainTex));
float3 diffuseColor2 = (newColor.rgb * _Color.rgb);

// 对于UV大于1的部分作为mask区域
float uvlow = step(i.uv0.x, 1);
float uvhigh = 1 - uvlow;
float3 diffuseColor = diffuseColor1 * uvlow + diffuseColor2 * uvhigh;
float alpha = (_ColorR.a + _ColorG.a + _ColorB.a) * 0.7 + uvhigh * 0.3;