如何为模型的某些部分着色-就像RTS游戏具有那些团队颜色一样?


16

我需要实现一些我们在RTS游戏中看到的东西:团队色彩。基本上,我正在寻找一种着色模型某些部分的方法。我将如何实现?我什至不知道从哪里开始。我是否需要首先对3d模型进行一些调整?

Answers:


18

我这样做的方法是基于要应用于单元的纹理贴图。对于大多数东西,您将需要对某些区域进行着色,而有些则不需要。例如,您可能有一个普通的战车,但您只想更改某些标志的颜色。

如果将纹理绘制为好像彩色区域是灰度的,则可以使用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);

您是否偶然知道如何将DirectX着色器添加到3ds Max中的3d模型中?当我尝试使用一种着色器类型设置材质并将着色器设置为ReplaceColor.fx并导出模型时,结果为Error 1 Missing asset "C:\Users\Kai\AppData\Local\Temp\fbx.shader.temp.1064.2756\ReplaceColor.fx"。我不明白该如何正确。
rFactor

是在加载时吗?FBX中的路径指向一个临时文件夹似乎很奇怪。该文件存在吗?我对从3ds Max导出FBX不太熟悉,但是也许您需要编辑文件(或设置选项)以使路径相对。
卢卡斯

好的技巧,但是如果您使用Alpha通道表示“可着色性”,请不要忘记在finalColor中重置Alpha分量。
charstar

3

一种技术是为每个模型设置两组纹理-一组红色,另一组蓝色。然后根据将角色分配给哪个团队来应用该纹理集。

显然,这只有在只有两个团队的情况下才有效。尽管您可能无法使用它超过两个,但它开始变得效率低下。

另一种方法是混合两种纹理-第一种是模型的基础纹理,第二种是可以在运行时生成的彩色叠加层。

第三种方法可能是更改基本模型的颜色,并且在要显示团队颜色的模型的那些部分上没有纹理(或部分透明的纹理)。


2

将纹理Alpha通道专用于团队颜色会使DXT纹理扩大2倍,因此我宁愿使用色度键来计算团队颜色。将一种颜色(例如,绿色,蓝色,洋红色)指定为纹理中的“保留颜色”。

引擎启动时,为每个团队颜色创建一个矩阵,该矩阵将“保留的颜色”旋转到团队颜色上。在绘制团队对象之前,将此矩阵设置为像素着色器常量。

在像素着色器中,通过组颜色矩阵转换像素颜色。使用与像素色度与“保留颜色”色度的角度成比例的量,使未转换的像素颜色与已转换的像素颜色一致。

这将花费您一些ALU指令并在像素着色器中触发,但是这比使用2倍大的纹理充实纹理缓存要便宜得多。

您还可以具有多个色度键(例如,将洋红色和青色映射到主要和次要色组颜色),而无需为每种颜色分配一个纹理通道。


1

我的技术是:具有2个纹理:一个主要纹理,一秒纹理覆盖主要纹理,但只有要着色的部分。根据需要更改第二个纹理的颜色。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.