Marek Winiarski

Unity3d OneLine #8 – Cel-shading

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.

Borderlands jako przykład cel-shadingu
Borderlands jako przykład cel-shadingu

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.

Cel-Shading
Źródło: Wikipedia

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:

Ustawiamy shader cel-shading dla postaci

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:

Cel-Shading dla materiału

No dobra, ale chyba najbardziej interesujący jest efekt?

Efekt domyślnego Cel-Shadingu w Unity3d
Exit mobile version