Unity3d OneLine – problemy, które da się rozwiązać w jednej linii kodu. Dosłownie!
Linia: Cel-shading, czyli twoja gra jak Borderlands
Zacznijmy od tego czym jest cel-shading, albo inaczej toon-shading? Jest to sposób rysowania obrazu w 3D, który symuluje rysowany wygląd obiektów. Najbardziej kojarzy się go z grą Borderlands.
Tutaj musimy sobie szybko obalić jeden mit. Czarny kontur wokół postaci potęguje efekt wrażenie rysunkowości, ale nie jest to fragment cel-shadingu. Sam cel-shading na chłopski rozum sprowadza się do obniżenia ilości odcieni kolorów. Tzn. zamiast gładkiego przejścia między kolorami, mamy kilka wyraźnych krawędzi.
Na obrazku powyżej dokładnie widać o co chodzi. Znika nam gładkie przejście tonów koloru, a pojawia się ostry przeskok.
Taki efekt osiągamy przez shader modyfikujący sposób wyświetlania pikseli. Nie będę teraz wchodził tutaj w szczegóły tworzenia shaderów i ich działania. Ale jeśli zobaczylibyśmy kod takiego shadera byłby w nim mniej więcej taki kod:
if(kolorPiksela > 200) { kolorPiksela = 200; } else if(kolorPiksela <= 200 && kolorPiksela > 150) { kolorPiksela = 150; } else if(kolorPiksela <= 150 && kolorPiksela > 90) { kolorPiksela = 100; } else if(kolorPiksela <= 90) { kolorPiksela = 0; }
Oczywiście jest to wyssany z palca pseudokod, do tego dość brzydki, bo shadery nie lubią ifów. Ale chodzi tutaj o zasadę. Jeśli nasz kolor piksela znajduje się pomiędzy jakąś wartością to ustalamy go na sztywno na jedną wartość. W moim przykładzie, piksele o kolorze 152, 199, 168, 173 stały by się kolorem 150.
Efekt? Mamy w sumie 4 odcienie 0, 100, 150 i 200, czyli dostajemy bardzo mocne przeskoki kolorów, co objawia się tymi wyraźnymi krawędziami. Warto jeszcze odnotować, że kolorPiksela jest tutaj umowny, bo kolory zostają z reguły te same i nie operujemy na kanałach RGB (choć możemy), ale na jasności i w taki sposób robimy sobie przeskoki między cieniami i refleksami świetlnymi. To wystarczy.
Cel-Shading w Unity
Teraz jak to zrobić w Unity? Potrzebujemy modelu. Dowolnego, da się to zrobić z każdym. Ja postarałem się pobrać jakiś lepszy z Asset Store, dla lepszego efektu.
Druga rzecz to import standardowej paczki efektów: [Assets -> Import Package… -> Effects].
Teraz zaznaczamy sobie nasz model i wystarczy mu zmienić jeden parametr:
Basic daje nam omawiany efekt. Basic Outline daje to samo plus obramówkę a’la Borderlands. Lit nie bawi się w tony, a ustawia jednolity kolor. Kolor jest dobierany przez uśrednienie kolorów wykorzystanej tekstury.
Tak naprawdę kolor, ustawiany jest dla danego materiału, dlatego zamiast modyfikować go na postaci, możemy wejść w ustawienia samego materiału:
No dobra, ale chyba najbardziej interesujący jest efekt?