Come colorare alcune parti di un modello - come i giochi RTS hanno quei colori di squadra?


16

Ho bisogno di implementare qualcosa che vediamo nei giochi RTS: i colori della squadra. Fondamentalmente, sto cercando un modo per colorare alcune parti di un modello. Come lo raggiungerei? Non ho idea di dove cominciare. Devo prima apportare alcune modifiche al modello 3d?

Risposte:


18

Il modo in cui lo farei è basato sulle mappe delle trame che stai applicando alle unità. Per la maggior parte delle cose avresti alcune regioni che devono essere colorate e altre no. Quindi, ad esempio, potresti avere un normale carro armato ma vuoi solo cambiare il colore di alcune bandiere.

Se dipingi la trama come se le aree colorate fossero in scala di grigi, puoi utilizzare il canale alfa per designare quali regioni devono essere colorate.

Quindi nel tuo shader potresti andare (per il modo più semplice):

float3 finalColor;
if (colorFromTex.a > 0)
 finalColor = colorFromTex.rgb;
else
 finalColor = colorFromTex.rgb*myTintColor.rgb;

Questo non è ottimale, dal momento che avrai una transizione difficile e avrai un ramo nel tuo shader. Invece è meglio andare:

float3 finalColor = lerp(colorFromTex.rgb, 
    colorFromTex.rgb*myTintColor.rgb, colorFromTex.a);

Sai per caso come ottenere lo shader DirectX per i modelli 3d in 3ds Max? Quando ho provato a impostare un materiale con un tipo di shader e impostato lo shader su ReplaceColor.fx ed esportato il modello, il risultato è stato Error 1 Missing asset "C:\Users\Kai\AppData\Local\Temp\fbx.shader.temp.1064.2756\ReplaceColor.fx". Non capisco come posso farlo correttamente.
rFactor

È quello quando lo carichi? Sembra strano che il percorso nell'FBX indichi una cartella temporanea. Quel file esiste? Non ho molta familiarità con l'esportazione di FBX da 3ds Max, ma forse è necessario modificare i file (o impostare un'opzione) per rendere i percorsi relativi.
Lucas,

Buona tecnica, ma se si utilizza il canale alfa per indicare la "tintabilità", non dimenticare di ripristinare il componente alfa in finalColor.
Charstar,

3

Una tecnica consiste nell'avere due serie di trame per ciascun modello: uno rosso e l'altro blu. Quindi, a seconda della squadra a cui è assegnato il personaggio, applica quel set di trame.

Ovviamente questo funziona solo se hai solo due squadre. Mentre potresti cavartela per più di due, inizia a diventare inefficiente.

Un altro modo è fondere due trame: la prima è la trama di base per il modello, la seconda è una sovrapposizione colorata che è possibile generare in fase di esecuzione.

Un terzo modo potrebbe essere quello di cambiare il colore del modello base e non avere trame (o trame parzialmente trasparenti) su quelle parti del modello che si desidera mostrare i colori della squadra.


2

Dedicare un canale alfa trama al colore della squadra rende le trame DXT 2 volte più grandi, quindi preferirei usare il chroma key per calcolare il colore della squadra. Designare un colore (ad es. Verde, blu, magenta) come "colore riservato" nelle trame.

Quando il motore si avvia, crea una matrice per ciascun colore di squadra che ruota il "colore riservato" sul colore di squadra. Appena prima di disegnare un oggetto team, imposta questa matrice come costante di pixel shader.

Nel pixel shader, trasforma il colore dei pixel con la matrice dei colori del team. Lerp il colore del pixel non trasformato con il colore del pixel trasformato, di una quantità proporzionale all'angolo del chroma del pixel rispetto al chroma del "colore riservato".

Questo ti costerà alcune istruzioni ALU e un trig nel pixel shader, ma è molto più economico che gonfiare la cache delle texture con trame due volte più grandi.

Hai anche la possibilità di avere più chroma key (ad es. Magenta e ciano vengono mappati su un colore di squadra principale e secondario) senza dedicare un canale di trama a ciascun colore.


1

La mia tecnica sarebbe: Avere 2 trame: una trama principale, una trama seconda sovrapponendo la trama principale ma solo le parti che si desidera colorare. Cambia il colore della seconda trama come desideri.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.