Wie kann man bestimmte Teile eines Modells einfärben - wie RTS-Spiele haben diese Teamfarben?

16

Ich muss etwas implementieren, das wir in RTS-Spielen sehen: Teamfarben. Grundsätzlich suche ich nach einer Möglichkeit, bestimmte Teile eines Modells einzufärben. Wie würde ich das erreichen? Ich habe keine Ahnung, wo ich überhaupt anfangen soll. Muss ich zuerst einige Anpassungen am 3D-Modell vornehmen?

rFactor
quelle

Antworten:

18

Die Art und Weise, wie ich dies tun würde, basiert auf den Textur-Maps, die Sie auf die Einheiten anwenden. Für die meisten Dinge gibt es Regionen, die getönt werden müssen, und Regionen, die nicht getönt werden müssen. Sie haben beispielsweise einen normalen Panzer, möchten aber nur die Farbe einiger Flaggen ändern.

Wenn Sie die Textur so malen, als wären die farbigen Bereiche Graustufen, können Sie mithilfe des Alphakanals festlegen, welche Bereiche eingefärbt werden müssen.

In deinem Shader könntest du also gehen (für den einfachsten Weg):

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

Das ist jedoch nicht optimal, da Sie einen harten Übergang haben und einen Zweig in Ihrem Shader haben werden. Stattdessen ist es besser zu gehen:

float3 finalColor = lerp(colorFromTex.rgb, 
    colorFromTex.rgb*myTintColor.rgb, colorFromTex.a);
Lucas
quelle
Wissen Sie zufällig, wie Sie den DirectX-Shader in 3ds Max auf die 3D-Modelle übertragen können? Als ich versuchte, ein Material mit einer Art Shader festzulegen und den Shader auf ReplaceColor.fx zu setzen und das Modell zu exportieren, war das Ergebnis Error 1 Missing asset "C:\Users\Kai\AppData\Local\Temp\fbx.shader.temp.1064.2756\ReplaceColor.fx". Ich verstehe nicht, wie ich das richtig machen kann.
rFactor
Ist das, wenn Sie es laden? Es scheint seltsam, dass der Pfad in der FBX auf einen temporären Ordner verweist. Existiert diese Datei? Ich bin nicht sehr vertraut mit dem Exportieren von FBX aus 3ds Max, aber möglicherweise müssen Sie die Dateien bearbeiten (oder eine Option festlegen), um die Pfade relativ zu machen.
Lucas
Gute Technik, aber wenn Sie den Alpha-Kanal verwenden, um "Tintability" zu kennzeichnen, vergessen Sie nicht, die Alpha-Komponente in Ihrer finalColor zurückzusetzen.
Charstar
3

Eine Technik besteht darin, zwei Sätze von Texturen für jedes Modell zu haben - einen roten und einen blauen. Abhängig davon, welchem ​​Team der Charakter zugewiesen ist, wenden Sie dieses Textur-Set an.

Dies funktioniert natürlich nur, wenn Sie nur zwei Teams haben. Während Sie möglicherweise länger als zwei Jahre damit durchkommen, wird es ineffizient.

Eine andere Möglichkeit besteht darin, zwei Texturen zu mischen - die erste ist die Basistextur für das Modell, die zweite ist eine farbige Überlagerung, die Sie zur Laufzeit generieren können.

Eine dritte Möglichkeit besteht darin, die Farbe des Basismodells zu ändern und keine Texturen (oder teilweise transparente Texturen) über den Teilen des Modells zu haben, für die Sie die Teamfarben anzeigen möchten.

ChrisF
quelle
2

Wenn Sie der Teamfarbe einen Textur-Alpha-Kanal zuweisen, werden die DXT-Texturen 2x größer. Daher würde ich lieber den Chroma-Key verwenden , um die Teamfarbe zu berechnen. Legen Sie eine Farbe (z. B. Grün, Blau, Magenta) als "reservierte Farbe" in Ihren Texturen fest.

Wenn der Motor hochfährt, erstellen Sie für jede Teamfarbe eine Matrix, die die "reservierte Farbe" auf die Teamfarbe dreht. Legen Sie diese Matrix unmittelbar vor dem Zeichnen eines Teamobjekts als Pixel-Shader-Konstante fest.

Transformieren Sie im Pixel-Shader die Pixelfarbe mithilfe der Team-Farbmatrix. Lerpen Sie die nicht transformierte Pixelfarbe mit der transformierten Pixelfarbe um einen Betrag, der proportional zum Winkel der Farbsättigung des Pixels zur Farbsättigung der "reservierten Farbe" ist.

Dies kostet Sie einige ALU-Anweisungen und das Auslösen im Pixel-Shader, ist aber viel billiger, als Ihren Textur-Cache mit doppelt so großen Texturen aufzublähen.

Sie können auch mehrere Chroma-Keys (z. B. Magenta und Cyan werden einer primären und sekundären Teamfarbe zugeordnet) verwenden, ohne dass jeder Farbe ein Texturkanal zugewiesen wird.

bmcnett
quelle
1

Meine Technik wäre: 2 Texturen zu haben: eine Haupttextur, eine zweite Textur, die die Haupttextur überlagert, aber nur die Teile, die Sie einfärben möchten. Ändern Sie die Farbe der zweiten Textur nach Ihren Wünschen.

daemonfire300
quelle