Physically-Based Rendering


===DOWNLOAD===
Przewodnik można też ściągnąć w wersji pdf TUTAJ lub TUTAJ

------------------------------
Obiekt który stworzyłem i oteksturowałem na potrzeby tutoriala. Nie jest piękny, ale spełnia swoje zadanie:

Sferka by adder1812 on Sketchfab


Moim celem było napisanie krótkiego przewodnika po PBR, głównie od strony teksturowania. Chciałbym wprowadzić Cię w temat tak, abyś z kompletem wiedzy mógł przystąpić do tworzenia tekstur w tej technice. Nie pominę tutaj niczego, co warto wiedzieć, jednak chciałbym unikać wchodzenia w zagadnienia techniczne. Zachęcam do zapoznania się z całym tematem we własnym zakresie, a dla tych, których temat bardziej zainteresuje, na końcu przewodnika umieszczę linki do artykułów o PBR.

Zacznijmy od odrobiny teorii i od wyjaśnienia, czym jest PBR/PBS, czym różni się od dotychczasowej techniki oraz czemu jest od niej lepszy.

PBR czyli Physically-Based Rendering i PBS - Physically-Based Shading to dwa określenia odnoszące się w do tej samej rzeczy. Bardzo trudno jest znaleźć jakąkolwiek definicję, która pozwoliłaby rozdzielić te pojęcia, jednak dla mnie PBR odnosi się raczej do technik renderowania, a PBS do oświetlania w real time.

Odszyfrujmy nazwę: Rendering bazowany na fizyce (fizycznym zachowaniu się światła i materiałów). Rendering, w którym (w końcu) algorytmy bazują na tym, jak w rzeczywistości fotony zachowują się na powierzchni obiektów. Moc obliczeniowa dostarczana nam przez nowoczesne komputery, daje możliwość odejścia od starych sposobów oświetlenia obiektów trójwymiarowych i zastąpienia ich czymś bardziej zaawansowanym - PBR. System ten jest dla grafika prostszy, bardziej logiczny, a przede wszystkim daje znacznie bardziej realistyczne i naturalne wyniki, niż dotychczasowe techniki.

Dawniej tworząc tekstury, na diffuse umieszczało się masę informacji. Nie tylko kolor i zanieczyszczenia, ale też na przykład ambient occlusion (AO). Teraz absolutnie nie wrzucimy AO do albedo (albedo nazywane też base color to nowa tekstura diffuse), lecz zostawimy ją jako oddzielną mapę, gdyż algorytmy shaderów użyją jej lepiej, gdy pozostanie oddzielną teksturą. Ważniejsze jest jednak, jak zmieniło się użycie i działanie tekstury specular. W specular definiowało się jasność odbicia. Na teksturze glossiness w nowym systemie definiujemy skupienie odbić, czyli to, jak wyraźnie odbija się środowisko. Możemy mieć bardzo jasne punktowe odbicia na powierzchni zachowującej się jak lustro (Rys. 1 po prawej), lub odbicia, które będą ledwo widoczne, bardzo szeroko rozlane, z rozmazanymi odbiciami ze środowiska (Rys. 1 po lewej).



Rys. 1. Glossiness 0,6 po lewej i 1 po prawej (źródło własne)


PBR ma wiele zalet. Pierwszą z nich jest fakt, że znika nam czynnik zgadywania, jak powinna zachowywać się dana powierzchnia. Większość znajdowanych w internecie informacji o wartościach dla różnych materiałów (zarówno metali jak i niemetali), zostało fizycznie zmierzonych ze świata realnego. Dzięki temu tekstury tworzone przez różnych grafików będą bardziej spójne, a co najważniejsze raz dobrze oteksturowany obiekt będzie właściwie wyglądał w każdych warunkach oświetleniowych.

Napisałem „większość znajdowanych informacji”, ponieważ oczywiście możliwe jest, że ktoś umieści listę, na której zgadywał, bo takie wartości wydawały mu się poprawne. Do tej pory zdarzało się, że obiekt musiał mieć drugą (albo i więcej) parę lekko zmienionych tekstur diffuse/spec, gdyż po przeniesieniu go z pięknie i jasno oświetlonej sceny do scenerii nocnej, nagle okazało się, że obiekt jest całkiem czarny lub że w ogóle nie odbija światła. Nigdy więcej, bo przybył nasz zbawca! Teraz prawidłowo zrobiony obiekt będzie zawsze wyglądał dobrze. A co nam to daje, poza cudownym uczuciem dobrze spełnionego obowiązku? Otóż artysta, który teksturuje obiekt zrobi to raz. Artysta powie: „To jest żelazo. Jest metalem, ma ono taką wartość na albedo i taki glossiness.”, oraz co najwyżej doda gdzieś korozje czy zabrudzenia. Będzie można tak teraz powiedzieć o (prawie) wszystkich materiałach.

Być może w tej chwili w Twojej głowie kiełkuje pytanie: „W takim razie czy w PBR dalej można tworzyć stylizowaną grafikę?” Film „Uniwersytet Potworny” jest najlepszą odpowiedzią, że tak - można. PBR nie czyni nas niewolnikiem realizmu, ale trzeba znać zasady, żeby wiedzieć, jak używać tego narzędzia.

Zatem chcesz jak najszybciej usiąść do swojego ukochanego programu do malowania i pytasz mnie, czego od Ciebie potrzebuje PBR?

Istnieją dwie główne techniki tworzenia tekstur do PBR. Są to Metal – Roughness, oraz Specular – Glossiness. Która lepsza? Żadna.

Metal – Roughness jest systemem popularniejszym i tym, którego będziemy używać w naszej pracy z Unity 5. Dostarczamy w nim kolorową teksturę z kolorem materiału i dwie skale szarości: jedna z informacją, co jest metalem i jedną z informacją o chropowatości powierzchni. Według mnie jest to system prostszy i bardziej odporny na nie fizyczne materiały, jednak nie da się w nim zrobić kilku skrajnych materiałów, takich jak na przykład kamienie szlachetne. Dodatkowo sposób ten zużywa mniej pamięci, gdyż dwie z trzech map są w skali szarości (w drugim sposobie tylko jedna).

W Specular – Glossiness mamy kontrole nad wartością początkową Fresnela dielektryków, co umożliwia stworzenie wymienionych wcześniej kamieni szlachetnych, jednak bardzo łatwo i przypadkowo można zbudować nie fizyczny materiał, który będzie w stanie odbić więcej światła niż go przyjął, łamiąc zasadę zachowania energii.

Nie będę już więcej pisać o technice Specular – Glossiness. Czas dowiedzieć się wszystkiego, co można o Metal – Roughness.

W nowym procesie tworzenia tekstur height, AO, emission oraz normal nie zmieniają się, ale nie będziemy tworzyć już tekstur diffuse i specular, tylko albedo, glossiness i metallic.

Być może drogi czytelniku zdążyłeś zauważyć, że miałem mówić o metal/rough, a napisałem, że będziemy używać mapy glossiness. To nie błąd. Unity 5 dla obu stylów pracy używa mapy glossiness. Co to za tekstury i czym się różnią? Obie są w skali szarości. Roughness (chropowatość) i glossiness (połyskliwość) to dwa końce tej samej skali. Różnica polega na tym, że w roughness im coś na teksturze jest bielsze tym jest bardziej chropowate, a na glossiness im coś bielsze tym bardziej połyskliwe. Innymi słowy glossiness to inwersja roughness. Jeśli pixel na mapie roughness ma jasność 0,7 to na mapie glossiness będzie to 0,3.

Zanim przejdę do opisu poszczególnych tekstur muszę jeszcze wyjaśnić, po co jest nam potrzebne rozróżnienie na metale (przewodniki elektryczne) i dielektryki (niemetale).

Pierwszym powodem rozdzielania na metale i niemetale jest Fresnel.

W grafice komputerowej Fresnel odnosi się do tego, jak bardzo dana powierzchnia jest lustrzana pod danym kątem obserwowania. Jeśli spojrzysz na dielektryczną powierzchnię będąc dokładnie na wprost niej (Rys. 2 linia a), najprawdopodobniej nie zobaczysz odbicia środowiska, w którym się znajdujesz. Jednak jeśli drastycznie zwiększysz kąt (Rys. 2 linia b) zobaczysz, że obiekt, na który patrzysz zaczyna zachowywać się jak lustro. Im bardziej zwiększymy kąt obserwacji, tym bardziej lustrzanie będzie zachowywać się powierzchnia (przykład Rys. 3). Stosunek dąży do 100% refleksji przy kącie 90°.



Rys. 2. Kąty obserwowania powierzchni (źródło własne)


Rys. 3. Fresnel w praktyce (źródło własne)


Wartość F0 to współczynnik odbicia Fresnela przy kącie 0° (obserwowanie na wprost, Rys. 2 a). Dla większości dielektryków F0 mieści się w zakresie 2-5% (przykładowy wyjątek to kamienie szlachetne 5-17%). W Metal – Roughness F0 jest programowo ustawione na sztywne 4% i nie jesteśmy w stanie tego kontrolować. F0 dla metali to minimum 50% i kontrolujemy to kolorem metalu na albedo. Efekt Fresnel całkiem nieźle jest zaprezentowany na poniższym zdjęciu.



Rys. 4. Fresnel (http://www.marmoset.co/toolbag/learn/pbr-theory)


Poniżej umieściłem wykres wartości F0 dla kilku przykładowych materiałów. Wyraźnie tutaj widzimy, że F0 dla metali nie schodzi poniżej 0,5, a dielektryki oscylują przy 0,05.



Rys. 5. F0 (źródło internet)


Drugim powodem rozdzielenia jest fakt, że refleksy na metalach są barwione przez kolor metalu (złoto, miedź), a dielektryki nie wykazują tego efektu. Na rysunku (Rys. 6) po lewej widzimy, że refleksy nie są zabarwione, natomiast na metalu po prawej wyraźnie widać zabarwienie odbić.



Rys. 6. Barwienie refleksów (źródło własne)



Rys. 6a. Kolorowe szkło (źródło własne)


Ostatni powód jest taki, że metale absorbują, a nie rozpraszają światło, które przeniknie przez powierzchnie. Oznacza to, że w absorpcji światło zamieniane jest na inną energię (ciepło), a w rozproszeniu jesteśmy w stanie zobaczyć światło przenikające z drugiej strony. Przykład z życia: nie ma przezroczystych metali, za to widzimy światło przenikające przez płatki uszu.

W tym momencie ci, którzy nie są grafikami lub nie interesują się zasadami tworzenia poszczególnych tekstur, mogą skończyć czytać, a reszta jedzie dalej.

Przystąpię teraz do konkretów, jak działają nowe tekstury i jakie powinny lub nie powinny znajdować się na nich informacje. Potem opiszę kilka trików, które zdążyliśmy już opracować razem z Oskarem Świeradem.


Ten obiekt oteksturowałem w programie Substance Painter, żeby móc zaprezentować Ci wygląd tekstur, które składają się na pracę w Metal – Roughness.




Albedo                                         Roughness                                         Metallic
Rys. 7. Przykładowy obiekt (źródło własne)


Albedo (Base Color)

Albedo to nasz nowy diffuse. Jednak jest to inna tekstura, a największą różnicą jest to, że na albedo nie umieszcza się żadnych informacji o świetle z wyjątkiem mikrookluzji. Albedo zawiera informacje o odbiciach kolorów dla dielektryków oraz kolor i współczynnik odbicia dla metali.

Oto fragment tekstury albedo z mojego przykładu. Dodałem zielone tło, by odróżnić wyspy:



Rys. 8. Albedo (źródło własne)


Oglądając różne tekstury albedo może wydawać się, że są spłaszczone tonalnie. Tworząc tą teksturę nie chcemy mieć wartości zbyt jasnych lub zbyt ciemnych. Robiąc teksturę węgla nie zrobimy jej całkowicie czarnej, lecz będzie to wartość nie ciemniejsza niż 30 sRGB, a robiąc świeży biały śnieg nie zrobimy go jaśniejszym niż 240 sRGB. Te dwa przykłady stanowią przykłady graniczne. Nie powinno się wychodzić poza zakres 50-240 sRGB (30 jest tolerowanym minimum). Co do metali, ich wartości będą wynosić 70-100%, czyli 180-255 sRGB. Jeśli na teksturze będą ciemniejsze wartości, oświetlenie w silniku zacznie wariować.

Interesujący jest fakt, że gdy mało się dzieje na albedo, lub nawet gdy jest to jednolity kolor to wcale nie oznacza, że tekstura będzie brzydka. Wszystko dzięki teksturze glossiness, na której teraz dzieje się magia.

W internecie można znaleźć dużo tabel ze zmierzonymi wartościami dla wielu różnych materiałów. Jednak zawierają one pewien haczyk. Jeśli wartość nie jest podana w sRGB, tylko liniowo, to nie wystarczy zwykłe przeliczenie jej na sRGB. Konieczne jest wprowadzenie korekcji gammy. Przykładowy wpis w jednej z takich tabel:

New Concrete                   0,5 (Linear)                   186 (sRGB)

Jeśli spróbujemy bezpośrednio przeliczyć 0,5 na sRGB to dostaniemy wartość 127,5 (0,5*255), jednak, jak już napisałem, będzie to błąd. Gdy zastosujemy kalkulator gammy dołączony do tego przewodnika otrzymamy 186 sRGB, czyli to, co było podane jako prawidłowa wartość w samej tabeli (wzór na przeliczenie gammy: Corrected = 255 * (Image/255)^(1/2,2) ). Nie wszystkie tabele są na tyle miłe, by podawać obie te wartości i koniecznie trzeba pamiętać o tej różnicy pomiędzy Linear, a sRGB.


Metallic

Tekstura metallic jest w skali szarości i działa na zasadzie maski - informuje shader, która część tekstury jest metalem, a która nie. Tekstura ta jest często binarna i zawiera jedynie pixle o wartościach 0 sRGB i 255 sRGB. Czarne rejony to dielektryki, a białe miejsca oznaczają czyste metale. Czyste metale na teksturze metallic nie powinny przyjmować wartości poniżej 235 sRGB. Rejony, które wpadają w zakres powyżej 235 sRGB, powinny mieć jasności 70-100% (180-255 sRGB) na teksturze albedo tak, jak pisałem o tym wyżej. Wszystkie podawane tu przeze mnie wartości pochodzą z pomiarów z rzeczywistych metali.

Teraz należy odpowiedzieć na bardzo ważne pytanie.

Jak wygląda tekstura metallic, gdy chcemy odtworzyć pomalowany metal, brudy na metalu lub zwykłą rdzę?

Fragment mojej tekstury metallic, z zielonym tłem, aby wyróżnić wyspy:



Rys. 9. Metallic (źródło własne)


Jak widzisz na powyższym rysunku, w miejscu zabrudzeń metalu tekstura jest szara, gdyż kurz i zabrudzenia nie zakrywają w pełni metalu. Tworzymy w ten sposób poprawną teksturę z przejściami między metalem a czymś, co nim nie jest. Kluczowe jest, by pamiętać, że gdy jasność na metallic spada poniżej 235 sRGB, koniecznie trzeba obniżyć jasność tych samych partii na teksturze albedo. Pewnie zapytasz: „dlaczego kluczowe?”. Ponieważ jest to granica, przy której metal przestaje być prawdziwym metalem. A jak pisałem wyżej, na albedo metale też mają swoje zasady.

Co do reszty - farba, rdza i temu podobne rzeczy w pełni zakrywają metal (staje się niewidoczny), więc traktujemy je jako dielektryki i zaznaczamy na teksturze metallic na czarno.


Glossiness

W Unity 5 spotkasz ją pod nazwą smoothness. Prawdopodobnie najprzyjemniejsza tekstura w tworzeniu. Właściwie nie da się zrobić jej źle. Wszystko zależy od tego, jaką historię powierzchni chcesz opisać. W PBR to na teksturze glossiness dzieje się najwięcej. Dawniej trzeba było kombinować na diffuse, teraz zabawa przeniosła się tutaj.

W rzeczywistości każda powierzchnia jest w jakimś stopniu chropowata. Ta tekstura dostarcza właśnie tej informacji. Gdy światło odbija się od powierzchni, powstaje refleks. Gdy dzieje się to na powierzchni chropowatej otrzymujemy duży rozmazany błysk, a gdy na gładkiej - mały i ostry wydający się jaśniejszy niż pierwszy. Warto wiedzieć, że intensywność światła w obu przypadkach jest dokładnie taka sama, różni się jedynie powierzchnia, na której światło zostało rozłożone.

Na rysunku poniżej przedstawiono zachowanie się światła na chropowatej powierzchni.



Rys. 10. Glossiness (www.marmoset.co/toolbag/learn/pbr-theory)


Tekstura glossiness, tak jak w przypadku metallic, jest w skali szarości. 0 sRGB to maksymalna chropowatość, a 255 sRGB to maksymalna połyskliwość.

Poniżej tekstura roughness (gdyż w tym systemie była tworzona) dla mojego przykładowego modelu. Tak jak już wspominałem roughness to odwrócona mapa glossiness. Jak uprzednio kolorem zielonym oznaczyłem tło, aby nie zgubić wysp:



Rys. 11. Roughness (źródło własne)


Oglądając powyższy rysunek, być może zauważyłeś ślad palca w górnej części. Ten ślad istnieje wyłącznie na teksturze glossiness, ale dzięki PBR jest całkiem ładnie widoczny na gotowym obiekcie (Rys. 12).



Rys. 12. Widoczność odcisku palca (źródło własne)


Tak wygląda przekrój przez wartości glossiness dla metali i niemetali:



Rys. 13. Wartości glossiness
(blogs.unity3d.com/2015/02/18/working-with-physically-based-shading-a-practical-approach/)


Zalecam nie używać pełnej jedynki, a delikatnie rozmyć odbicia przez wartość glossiness 0,95-0,99, jak również nie używać 0, gdyż nie ma rzeczy z zerowym glossiness.

Pamiętaj o jeszcze jednym: przeliczenie Linear – sRGB wykonuje się wyłącznie dla Albedo. Więc jeśli wybierając w Unity poziom glossiness wyjdzie Ci idealnie to co chcesz przy wartości glossiness 0,3 to nie przeliczysz tego jak albedo, tylko użyjesz na teksturze wartości 77 sRGB (0,3*255).


Podsumujmy podstawowe wytyczne przy tworzeniu tekstur dla PBR.

Albedo:
- nie należy umieszczać informacji o świetle z wyjątkiem mikrookluzji,
- najciemniejsze wartości nie powinny być ciemniejsze niż 50 sRGB z tolerancją do 30 sRGB,
- najjaśniejsze wartości nie powinny być jaśniejsze niż 240 sRGB,
- czysty metal powinien zawierać się w wartościach 70-100% (180-255 sRGB).

Metallic:
- 0 sRGB to dielektryk, a 255 sRGB to metal,
- pomalowany i zardzewiały metal traktujemy jako dielektryk,
- dozwolone jest robienie skali szarości dla brudu lub przejść z rdzą i farbą,
- jeśli wartość na teksturze spadną poniżej 235 sRGB należy to uwzględnić na albedo.

Glossiness:
- 0 sRGB to powierzchnie totalnie chropowate, a 255 sRGB maksymalnie połyskliwe,
- bądź kreatywny!


Pozostało szybkie omówienie map wspólnych ze starym systemem. Tworzenie czy używanie mapy normal nie zmieniło się.

Napisałem wyżej, że AO nie należy już dodawać do innych map, jak dawniej robiono. AO ma być mapą, która poinformuje shader, do jakich rejonów obiektu zawsze dotrze mniej światła (wszelkie zagłębienia). AO nie wpływa na oświetlenie bezpośrednie z dynamicznych świateł, tylko na oświetlenie ze środowiska. Przykład: otwór w obiekcie pozostanie ciemny dopóki nie zaświecimy w niego latarką.


Tips and Trick:

Do tej pory wymyśliliśmy kilka ciekawych praktyk, które mogą pomoc Ci przy tworzeniu tekstur w PBR. Oto i one:


Dopasowanie koloru albedo:

Gdy w tablicach znajdziesz kolor albedo materiału, który chciałbyś zrobić i masz znalezioną teksturę, której chcesz użyć, istnieje bardzo przyjemny sposób, by się dopasować do koloru.

Na oddzielnej warstwie stwórz kształt (prostokąt) i wlej w niego żądany kolor. Potem bardzo pomniejsz cały obraz, tak, by nie widzieć żadnych szczegółów, a tylko ogólny kolor tekstury i kwadratu. Następnie za pomocą krzywych, lub innego narzędzia, dopasuj teksturę tak, by zlała się z testowym kwadratem. Przed tym dopasowaniem można też spróbować zbliżyć teksturę za pomocą Match Color, jednak to nie koniecznie da dobry skutek.


Markowanie otworów na obiekcie:

Ta technika miała do tej pory tylko kilka okazji użycia, więc nie powiem w stu procentach, że jest dobra. Gdy chcesz zrobić klatkę wentylacyjną, siatkę głośnika lub cokolwiek, na czym chcesz zamarkować istnienie niewielkich dziur, będzie to jedyny powód do użycia czarnego (0 sRGB) na teksturze albedo. Oczywiście trzeba też dodać te miejsca na AO.


Znalezienie dobrej wartości glossiness:

Znalezienie pasującej wartości glossiness może być trudne, zwłaszcza na początku. Dopóki nie wyrobisz sobie wyczucia, polecam wrzucenie albedo do Unity, lub programu typu Marmoset i operowanie suwakiem glossiness. Potem pozostaje tylko przepisanie zadowalającej wartości do tekstury lub dopasowanie tekstury, jak w sposobie „Dopasowanie koloru albedo” powyżej.


Jednolite Albedo:

Użycie jednolitego koloru albedo ma kilka plusów. Po pierwsze, jak pisałem w sekcji o albedo, użycie jednolitego koloru w PBR nie daje złych efektów. Co więcej jest to potem łatwo przerobić na teksturę glossiness. Przykład z życia: chcemy stworzyć śruby. Robimy je jednolitym kolorem na albedo, kształt wyciągniemy dzięki teksturze normal. Glossiness również zrobimy jednolity. Dodajemy na AO zagłębienia śruby i skończone.



Na zakończenie została Ci już tylko jedna rzecz do zrobienia. Zapisanie tekstur dla Unity.

Gdy tworzyliśmy tekstury dla Unity 4 umieszczaliśmy teksturę specular jako alfę na diffuse. W Unity 5 sprawy wyglądają trochę inaczej. Tym razem glossiness jest alfą dla tekstury metallic, a albedo posiada przezroczystość, ale tylko jeśli jest to przezroczystość, którą chcesz widzieć na obiekcie (woda, szyby itd).

Pamiętasz zapewne, że mapy metallic i glossiness są w skali szarości. AO oczywiście też. W Unity 5 można stworzyć jedną teksturę która będzie zawierać te trzy mapy. Trzeba tylko wrzucić metallic do kanału red tekstury, AO do green, a glossiness do alpha. Z przyczyn znanych tylko twórcom Unity, kanał blue jest w ogóle nie wykorzystywany (a byłby idealnym gospodarzem dla ewentualnej mapy height).


Polecane strony i artykuły:

Allegorithmic:
The comprehensive PBR guide:
https://www.allegorithmic.com/pbr-guide

Marmoset:
Basic Theory of Physically-Based Rendering:
http://www.marmoset.co/toolbag/learn/pbr-theory
Tutorial: Physically Based Rendering, And You Can Too!:
http://www.marmoset.co/toolbag/learn/pbr-practice

Everything is Shiny:
http://filmicgames.com/archives/547

Everything has Fresnel:
http://filmicgames.com/archives/557

SIGGRAPH 2014 Course: Physically Based Shading in Theory and Practice:
http://blog.selfshadow.com/publications/s2014-shading-course/

Working with Physically-Based Shading: a Practical Approach:
http://blogs.unity3d.com/2015/02/18/working-with-physically-based-shading-a-practical-approach/

BRDF:
http://pl.wikipedia.org/wiki/BRDF

Physically Based Rendering Encyclopedia:
https://docs.google.com/document/d/1Fb9_KgCo0noxROKN4iT8ntTbx913e-t4Wc2nMRWPzNk/edit

Monsters University: rendering physically based monsters:
http://www.fxguide.com/featured/monsters-university-rendering-physically-based-monsters/

------------------------------
Podziękowania za pomoc przy pisaniu i testowaniu tutoriala dla:

Oskara Świerada,
Natalii Bilińskiej,
Pawła Rendaszki.

Brak komentarzy:

Prześlij komentarz