回答:
これを行う方法は、ユニットに適用するテクスチャマップに基づいています。ほとんどの場合、色付けする必要がある領域とそうでない領域があります。たとえば、通常の戦車を持っているかもしれませんが、いくつかのフラグの色を変更したいだけです。
色付きの領域がグレースケールであるかのようにテクスチャをペイントする場合、アルファチャネルを使用して、色付けする必要がある領域を指定できます。
したがって、シェーダーに行くことができます(最も簡単な方法):
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);
1つの手法は、モデルごとに2セットのテクスチャを使用することです-赤と青 次に、キャラクターが割り当てられているチームに応じて、そのテクスチャセットを適用します。
明らかにこれは、チームが2つしかない場合にのみ機能します。2回以上使用するとうまくいかないかもしれませんが、非効率になり始めます。
もう1つの方法は、2つのテクスチャをブレンドすることです。1つはモデルのベーステクスチャ、2つ目は実行時に生成できる色付きのオーバーレイです。
3番目の方法は、ベースモデルの色を変更し、チームの色を表示するモデルの部分にテクスチャー(または部分的に透明なテクスチャー)を持たないようにすることです。
テクスチャアルファチャンネルをチームカラーに当てると、DXTテクスチャが2倍大きくなるため、クロマキーを使用してチームカラーを計算します。テクスチャの「予約色」として1つの色(緑、青、マゼンタなど)を指定します。
エンジンが起動したら、各チームカラーのマトリックスを作成し、「予約色」をチームカラーに回転させます。チームオブジェクトを描画する直前に、このマトリックスをピクセルシェーダー定数として設定します。
ピクセルシェーダーで、チームカラーマトリックスによってピクセルカラーを変換します。ピクセルの彩度と「予約色」の彩度の角度に比例する量だけ、変換されていないピクセル色を変換されたピクセル色で抽出します。
これには、いくつかのALU命令とピクセルシェーダーのトリガーがかかりますが、2倍の大きさのテクスチャでテクスチャキャッシュを膨らませるよりもはるかに安価です。
また、各色に1つのテクスチャチャンネルを割り当てずに、複数のクロマキー(たとえば、マゼンタとシアンをプライマリおよびセカンダリチームカラーにマッピングする)を使用できます。
私のテクニックは次のとおりです。2つのテクスチャ:1つのメインテクスチャ、メインにオーバーレイする1つ目のテクスチャ、ただし着色したい部分のみ。必要に応じて2番目のテクスチャの色を変更します。
Error 1 Missing asset "C:\Users\Kai\AppData\Local\Temp\fbx.shader.temp.1064.2756\ReplaceColor.fx"
。どうすればそれが正しいのか理解できません。