Comment coloriser certaines parties d'un modèle - comme les jeux RTS ont ces couleurs d'équipe?

16

J'ai besoin d'implémenter quelque chose que nous voyons dans les jeux RTS: les couleurs de l'équipe. Fondamentalement, je cherche un moyen de coloriser certaines parties d'un modèle. Comment pourrais-je y parvenir? Je ne sais même pas par où commencer. Dois-je d'abord faire quelques ajustements au modèle 3D?

rFactor
la source

Réponses:

18

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);
Lucas
la source
Savez-vous comment obtenir le shader DirectX pour les modèles 3D dans 3ds Max? Lorsque j'ai essayé de définir un matériau avec un type de shader et de définir le shader sur ReplaceColor.fx et d'exporter le modèle, le résultat était 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.
rFactor
Est-ce que c'est lorsque vous le chargez? Il semble étrange que le chemin dans le FBX pointe vers un dossier temporaire. Ce fichier existe-t-il? Je ne suis pas très familier avec l'exportation de FBX à partir de 3ds Max, mais vous devez peut-être modifier les fichiers (ou définir une option) pour rendre les chemins relatifs.
Lucas
Bonne technique, mais si vous utilisez le canal alpha pour désigner la "teinte", n'oubliez pas de réinitialiser le composant alpha dans votre finalColor.
charstar
3

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.

ChrisF
la source
2

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.

bmcnett
la source
1

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.

daemonfire300
la source