Jak pokolorować niektóre części modelu - jak gry RTS mają te kolory drużynowe?

16

Potrzebuję zaimplementować coś, co widzimy w grach RTS: kolory zespołu. Zasadniczo szukam sposobu na pokolorowanie niektórych części modelu. Jak mam to osiągnąć? Nie mam pojęcia, od czego zacząć. Czy najpierw muszę wprowadzić poprawki w modelu 3d?

rFactor
źródło

Odpowiedzi:

18

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);
Lucas
źródło
Czy wiesz, jak przenieść moduł cieniujący DirectX do modeli 3d w 3ds Max? Kiedy próbowałem ustawić materiał z typem modułu cieniującego i ustawić moduł cieniujący na ReplaceColor.fx i wyeksportowałem model, wynik był następujący Error 1 Missing asset "C:\Users\Kai\AppData\Local\Temp\fbx.shader.temp.1064.2756\ReplaceColor.fx". Nie rozumiem, jak mogę to naprawić.
rFactor
Czy to kiedy go załadujesz? Dziwne wydaje się, że ścieżka w FBX wskazywałaby na folder tymczasowy. Czy ten plik istnieje? Nie jestem zbyt obeznany z eksportowaniem FBX z 3ds Max, ale być może trzeba edytować pliki (lub ustawić opcję), aby ścieżki były względne.
Lucas,
Dobra technika, ale jeśli używasz kanału alfa do oznaczenia „barwienia”, nie zapomnij zresetować składnika alfa w końcowym kolorze.
charstar
3

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.

ChrisF
źródło
2

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.

bmcnett
źródło
1

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.

daemonfire300
źródło