Answers:
我这样做的方法是基于要应用于单元的纹理贴图。对于大多数东西,您将需要对某些区域进行着色,而有些则不需要。例如,您可能有一个普通的战车,但您只想更改某些标志的颜色。
如果将纹理绘制为好像彩色区域是灰度的,则可以使用Alpha通道指定需要着色的区域。
因此,您可以在着色器中(以最简单的方式):
float3 finalColor;
if (colorFromTex.a > 0)
finalColor = colorFromTex.rgb;
else
finalColor = colorFromTex.rgb*myTintColor.rgb;
但是,这并不是最佳选择,因为您将要进行艰难的过渡并在着色器中有一个分支。相反,最好去:
float3 finalColor = lerp(colorFromTex.rgb,
colorFromTex.rgb*myTintColor.rgb, colorFromTex.a);
将纹理Alpha通道专用于团队颜色会使DXT纹理扩大2倍,因此我宁愿使用色度键来计算团队颜色。将一种颜色(例如,绿色,蓝色,洋红色)指定为纹理中的“保留颜色”。
引擎启动时,为每个团队颜色创建一个矩阵,该矩阵将“保留的颜色”旋转到团队颜色上。在绘制团队对象之前,将此矩阵设置为像素着色器常量。
在像素着色器中,通过组颜色矩阵转换像素颜色。使用与像素色度与“保留颜色”色度的角度成比例的量,使未转换的像素颜色与已转换的像素颜色一致。
这将花费您一些ALU指令并在像素着色器中触发,但是这比使用2倍大的纹理充实纹理缓存要便宜得多。
您还可以具有多个色度键(例如,将洋红色和青色映射到主要和次要色组颜色),而无需为每种颜色分配一个纹理通道。
我的技术是:具有2个纹理:一个主要纹理,一秒纹理覆盖主要纹理,但只有要着色的部分。根据需要更改第二个纹理的颜色。
Error 1 Missing asset "C:\Users\Kai\AppData\Local\Temp\fbx.shader.temp.1064.2756\ReplaceColor.fx"
。我不明白该如何正确。