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);
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.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.
quelle
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.
quelle
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.
quelle