A maneira como eu faria isso é baseada nos mapas de textura que você está aplicando às unidades. Para a maioria das coisas, você teria algumas regiões que precisam ser coloridas e outras que não. Por exemplo, você pode ter um tanque normal, mas deseja alterar apenas a cor de algumas bandeiras.
Se você pintar a textura como se as regiões coloridas estivessem em escala de cinza, poderá usar o canal alfa para designar quais regiões precisam ser coloridas.
Então, no seu shader, você pode (da maneira mais simples):
float3 finalColor;
if (colorFromTex.a > 0)
finalColor = colorFromTex.rgb;
else
finalColor = colorFromTex.rgb*myTintColor.rgb;
No entanto, isso não é ideal, pois você terá uma transição difícil e um ramo no shader. Em vez disso, é melhor ir:
float3 finalColor = lerp(colorFromTex.rgb,
colorFromTex.rgb*myTintColor.rgb, colorFromTex.a);
Error 1 Missing asset "C:\Users\Kai\AppData\Local\Temp\fbx.shader.temp.1064.2756\ReplaceColor.fx"
. Eu não entendo como posso corrigir isso.Uma técnica é ter dois conjuntos de texturas para cada modelo - um vermelho e o outro azul. Então, dependendo de qual time o personagem é atribuído, você aplica esse conjunto de texturas.
Obviamente, isso só funciona se você tiver apenas duas equipes. Embora você possa se safar por mais de dois, ele começa a ficar ineficiente.
Outra maneira é misturar duas texturas - a primeira sendo a textura base para o modelo, a segunda sendo uma sobreposição colorida que você pode gerar em tempo de execução.
Uma terceira maneira poderia ser alterar a cor do modelo base e não ter texturas (ou texturas parcialmente transparentes) sobre as partes do modelo que você deseja mostrar as cores da equipe.
fonte
Dedicar um canal alfa de textura à cor da equipe torna as texturas DXT 2x maiores, então prefiro usar a tecla chroma para calcular a cor da equipe. Designe uma cor (por exemplo, verde, azul, magenta) como a "cor reservada" nas suas texturas.
Quando o mecanismo inicializar, faça uma matriz para cada cor da equipe que gire a "cor reservada" para a cor da equipe. Antes de desenhar um objeto de equipe, defina essa matriz como uma constante de sombreamento de pixels.
No pixel shader, transforme a cor do pixel pela matriz de cores da equipe. Lerp a cor do pixel não transformado com a cor do pixel transformado, em uma quantidade proporcional ao ângulo do croma do pixel em relação ao croma da "cor reservada".
Isso vai lhe custar algumas instruções da ALU e disparar no pixel shader, mas é muito mais barato do que aumentar o cache de textura com texturas duas vezes maiores.
Você também pode ter várias chaves de croma (por exemplo, magenta e ciano, mapeadas em uma cor de equipe primária e secundária) sem dedicar um canal de textura para cada cor.
fonte
Minha técnica seria: Ter 2 texturas: uma textura principal, uma segunda textura sobrepondo a principal, mas apenas as partes que você deseja colorir. Mude a cor da segunda textura como quiser.
fonte