Como colorir certas partes de um modelo - como os jogos RTS têm essas cores de equipe?

16

Estou precisando implementar algo que vemos nos jogos RTS: cores da equipe. Basicamente, estou procurando uma maneira de colorir certas partes de um modelo. Como eu conseguiria isso? Não faço ideia por onde começar. Preciso fazer alguns ajustes no modelo 3d primeiro?

rFactor
fonte

Respostas:

18

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);
Lucas
fonte
Você sabe como obter o sombreador DirectX para os modelos 3d no 3ds Max? Quando tentei definir um material com um tipo de sombreador, defina-o como ReplaceColor.fx e exportei o modelo, o resultado foi 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.
perfil
É quando você carrega? Parece estranho que o caminho no FBX aponte para uma pasta temporária. Esse arquivo existe? Não estou familiarizado com a exportação de FBX do 3ds Max, mas talvez você precise editar os arquivos (ou definir uma opção) para tornar os caminhos relativos.
Lucas
Boa técnica, mas se você estiver usando o canal alfa para indicar "matizabilidade", não se esqueça de redefinir o componente alfa em sua finalColor.
charstar
3

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.

ChrisF
fonte
2

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.

bmcnett
fonte
1

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.

daemonfire300
fonte