La façon dont je le ferais est basée sur les cartes de texture que vous appliquez aux unités. Pour la plupart des choses, vous auriez des régions qui doivent être teintées et d'autres non. Ainsi, par exemple, vous pourriez avoir un réservoir normal, mais vous souhaitez simplement changer la couleur de certains drapeaux.
Si vous peignez la texture comme si les régions colorées étaient en niveaux de gris, vous pouvez ensuite utiliser le canal alpha pour désigner les régions à coloriser.
Donc, dans votre shader, vous pouvez aller (pour la manière la plus simple):
float3 finalColor;
if (colorFromTex.a > 0)
finalColor = colorFromTex.rgb;
else
finalColor = colorFromTex.rgb*myTintColor.rgb;
Ce n'est pas optimal, car vous aurez une transition difficile et une branche dans votre shader. Au lieu de cela, il vaut mieux y aller:
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"
. Je ne comprends pas comment puis-je obtenir cela correctement.Une technique consiste à avoir deux ensembles de textures pour chaque modèle - un rouge, l'autre bleu. Ensuite, en fonction de l'équipe à laquelle le personnage vous est attribué, appliquez cet ensemble de textures.
Évidemment, cela ne fonctionne que si vous n'avez que deux équipes. Bien que vous puissiez vous en tirer plus de deux fois, cela commence à devenir inefficace.
Une autre façon consiste à mélanger deux textures - la première étant la texture de base du modèle, la seconde étant une superposition colorée que vous pourriez générer lors de l'exécution.
Une troisième façon pourrait être de changer la couleur du modèle de base et de ne pas avoir de textures (ou de textures partiellement transparentes) sur les parties du modèle dont vous souhaitez afficher les couleurs d'équipe.
la source
Consacrer un canal alpha de texture à la couleur de l'équipe rend les textures DXT 2x plus grandes, donc je préfère utiliser la clé chroma pour calculer la couleur de l'équipe. Désignez une couleur (par exemple vert, bleu, magenta) comme "couleur réservée" dans vos textures.
Lorsque le moteur démarre, faites une matrice pour chaque couleur d'équipe qui fait pivoter la "couleur réservée" sur la couleur d'équipe. Juste avant de dessiner un objet d'équipe, définissez cette matrice comme constante de pixel shader.
Dans le pixel shader, transformez la couleur des pixels par la matrice de couleurs de l'équipe. Lerp la couleur de pixel non transformée avec la couleur de pixel transformée, d'une quantité proportionnelle à l'angle de la chrominance du pixel par rapport à la chrominance de la "couleur réservée".
Cela vous coûtera quelques instructions ALU et déclenchera dans le pixel shader, mais c'est beaucoup moins cher que de gonfler votre cache de texture avec des textures 2x plus grandes.
Vous avez également la possibilité d'avoir plusieurs incrustations chromatiques (par exemple, le magenta et le cyan sont mappés sur une couleur d'équipe principale et secondaire) sans consacrer un canal de texture à chaque couleur.
la source
Ma technique serait: Avoir 2 textures: une texture principale, une seconde texture superposant la principale mais uniquement les parties que vous souhaitez colorer. Modifiez la couleur de la deuxième texture comme vous le souhaitez.
la source