Sposób, w jaki to zrobię, opiera się na mapach tekstur, które nakładasz na jednostki. W przypadku większości rzeczy masz pewne regiony, które wymagają zabarwienia, a niektóre nie. Na przykład możesz mieć normalny czołg, ale chcesz tylko zmienić kolor niektórych flag.
Jeśli malujesz teksturę tak, jakby kolorowe regiony były w skali szarości, możesz użyć kanału alfa, aby określić, które regiony należy pokolorować.
Więc w swoim shaderze możesz przejść (najprostszy sposób):
float3 finalColor;
if (colorFromTex.a > 0)
finalColor = colorFromTex.rgb;
else
finalColor = colorFromTex.rgb*myTintColor.rgb;
Nie jest to jednak optymalne, ponieważ będziesz mieć trudne przejście i będziesz mieć gałąź w swoim shaderze. Zamiast tego lepiej jest przejść:
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"
. Nie rozumiem, jak mogę to naprawić.Jedną z technik jest posiadanie dwóch zestawów tekstur dla każdego modelu - jeden czerwony, drugi niebieski. Następnie w zależności od zespołu, do którego przypisana jest postać, zastosuj ten zestaw tekstur.
Oczywiście działa to tylko wtedy, gdy masz tylko dwa zespoły. Chociaż możesz uciec od więcej niż dwóch, zaczyna się nieefektywnie.
Innym sposobem jest połączenie dwóch tekstur - pierwsza to podstawowa tekstura modelu, druga to kolorowa nakładka, którą można wygenerować w czasie wykonywania.
Trzecim sposobem może być zmiana koloru modelu podstawowego i brak tekstur (lub częściowo przezroczystych tekstur) nad tymi częściami modelu, w których chcesz pokazać kolory zespołu.
źródło
Poświęcenie kanału alfa tekstury kolorowi zespołu sprawia, że tekstury DXT są 2x większe, więc wolałbym użyć klucza chrominancji do obliczenia koloru zespołu. Oznacz jeden kolor (np. Zielony, niebieski, purpurowy) jako „kolor zastrzeżony” w swoich teksturach.
Po uruchomieniu silnika utwórz matrycę dla każdego koloru zespołu, która obraca „kolor zarezerwowany” na kolor zespołu. Tuż przed narysowaniem obiektu zespołu ustaw tę macierz jako stałą modułu cieniującego piksele.
W module cieniującym pikseli przekształć kolor piksela za pomocą matrycy kolorów zespołu. Lerp nietransformowany kolor piksela za pomocą transformowanego koloru piksela, o wartość proporcjonalną do kąta nasycenia koloru piksela do nasycenia koloru „zarezerwowanego koloru”.
Będzie to kosztowało trochę instrukcji ALU i wyzwalacza w module cieniującym piksele, ale jest to o wiele tańsze niż powiększanie pamięci podręcznej tekstur z teksturami 2x większymi.
Masz również możliwość posiadania wielu kluczy barwy (np. Magenta i cyjan mapowane na podstawowy i drugorzędny kolor zespołu) bez poświęcania jednego kanału tekstury dla każdego koloru.
źródło
Moją techniką byłoby: posiadanie 2 tekstur: jedna główna tekstura, jedna druga tekstura nakładająca się na główną, ale tylko te części, które chcesz pokolorować. Zmień kolor drugiej tekstury, jak chcesz.
źródło