GGX i Fresnel z poprzedniej książki nie znikają w produkcyjnym shaderze — chowają się pod nazwami parametrów, które trzeba umieć odczytać z powrotem jako wzór.
Żaden z tych shaderów nie każe Ci budować materiału z osobnych node'ów BRDF połączonych w graf — GGX i Fresnel z poprzedniej książki (raytracing-book, Rozdziały 10–11) siedzą już w środku, jako gotowe warstwy jednego node'a, którym możesz sterować pojedynczymi parametrami. Kolejność warstw w obu jest niemal identyczna, licząc od góry (najbardziej zewnętrznej) w dół:
Większość wierszy w tabeli niżej to zwykła zamiana nazwy — ten sam parametr, ta sama jednostka, można wpisać bez myślenia. Kilka wierszy jest oznaczonych, bo kryje w sobie prawdziwą pułapkę koncepcyjną, nie tylko nazewniczą.
| aiStandardSurface | PxrSurface | Uwaga |
|---|---|---|
base_color | Diffuse Color | proste 1:1 |
base (weight) | Diffuse Gain | proste 1:1 |
diffuse_roughness | Diffuse Roughness | ta sama idea — spłaszcza Lamberta, „proszkowy” wygląd |
specular_color | Specular Face/Edge Color | PxrSurface rozdziela kolor na wprost i pod kątem — patrz Rozdział 14 |
specular_roughness | Specular Roughness | ta sama idea, ale Arnold podnosi roughness do kwadratu wewnętrznie |
metalness | brak bezpośredniego odpowiednika | osiągane przez Face/Edge Color — patrz Rozdział 14 |
specular_anisotropy | Anisotropy | Arnold 0→1, PxrSurface −1→1 (ujemna połowa = te same elipsy obrócone o 90°) |
specular_rotation | Shading Tangent | brak suwaka — tylko wejście-połączenie, trzeba odbudować mapą tangent |
| (zawsze GGX) | Specular Model | PxrSurface: Beckmann (domyślnie) albo GGX — patrz Rozdział 14 |
coat | Clearcoat | osobny Face/Edge Color, roughness, IOR ≈ 1,5 w obu — Rozdział 15 |
sheen / sheen_color | Fuzz Gain / Fuzz Color | proste 1:1 — Rozdział 15 |
sheen_roughness | Fuzz Cone Angle | nie roughness — kąt w stopniach; Cone Angle ≈ 32 × Sheen Roughness |
subsurface_radius | Mean Free Path Color | promień staje się kolorem — Rozdział 16 |
subsurface_scale | Mean Free Path Distance | skala staje się dystansem, dodatkowo mnożonym przez Unit Length — Rozdział 16 |
emission / emission_color | Glow Gain / Glow Color | proste przemianowanie |
transmission | Reflection Gain i Refraction Gain | jeden suwak staje się dwoma — Rozdział 15 |
opacity (RGB) | Presence (float) | kolorowa opacity nie ma dokąd trafić — Presence chce 0 albo 1 |
Pełna mapa parametr-na-parametr, oba shadery, stan na RenderMan 24–26 / Arnold aktualne wydania.
W Arnoldzie metalness to jeden suwak, który po cichu robi dwie rzeczy naraz: barwi specular kolorem z base_color i wygasza diffuse (metal nie ma rozproszenia podpowierzchniowego — światło albo się odbija, albo zostaje pochłonięte, nic nie ucieka spod powierzchni). PxrSurface nie ma tego suwaka w ogóle. Zamiast tego dajesz wprost dwa kolory Fresnela: Specular Face Color (odbicie patrząc wprost) i Specular Edge Color (odbicie pod kątem, przy grazing angle). Dielektryk dostaje niski, prawie neutralny Face Color i biały Edge Color; metal dostaje oba kolory przesunięte w stronę rzeczywistej barwy metalu — i, co łatwo pominąć, ręcznie wyzerowany Diffuse Gain. Pominięcie tego drugiego kroku to najczęstszy powód, dla którego przekonwertowany metal wygląda jak szary plastik, nie jak metal.
Do tego dochodzi Specular Model: Arnold zawsze liczy GGX, PxrSurface domyślnie startuje z Beckmanna — różnica widoczna w tym, jak gwałtownie gaśnie brzeg poświaty (Beckmann urywa się ostro, GGX ciągnie miękki „ogon”), najbardziej zauważalna na lakierze samochodowym i wypolerowanej podłodze. Trzeba przełączyć na GGX osobno na warstwie Specular i osobno na Clearcoat — to dwa niezależne ustawienia, nie jedno globalne.
↓ Rozdział 14 — pełny wywód: Fresnel dielektryka kontra metalu, edge tint, energiaaiStandardSurface prowadzi księgowość energii automatycznie i po cichu: podniesienie metalness wygasza diffuse, włączenie transmission je zmniejsza, dołożenie coat przyciemnia to, co jest pod spodem — wszystko dzieje się w tle, bez Twojego udziału. PxrSurface oddaje Ci ten budżet i ufa, że sam go rozliczysz: warstwy są niezależne, podniesienie specular nie obniża diffuse, nic Cię nie ostrzeże, jeśli warstwy razem odbijają więcej światła, niż w ogóle padło. To nie jest niedopatrzenie w konstrukcji PxrSurface — to świadomy wybór większej kontroli kosztem większej odpowiedzialności.
Sam oficjalny konwerter Pixara, tłumaczący materiały z Arnolda na PxrSurface, ręcznie domnaża: Diffuse Gain × (1 − metalness) × (1 − subsurface) oraz Subsurface Gain × (1 − sheen) — właśnie dlatego, że PxrSurface tego sam nie zrobi. Praktyczna reguła, która oszczędza najwięcej czasu przy budowie warstwowego materiału w PxrSurface: za każdym razem, gdy podnosisz jeden gain, zapytaj, który inny powinien w zamian zejść w dół. Podniesienie Subsurface Gain do 1 bez obniżenia Diffuse Gain oświetla materiał podwójnie — i dokładnie ten sam błąd powtarza się przy Fuzz nałożonym na materiał z aktywnym subsurface.
Świeży aiStandardSurface od razu wygląda jak używalny biały plastik — domyślne wartości są dobrane tak, żeby coś sensownego było widać od pierwszej klatki. Świeży PxrSurface wygląda jak matowa, ciemnoszara kula bez żadnego połysku. To nie błąd — PxrSurface startuje z niemal wszystkim wyłączonym, tam gdzie Arnold startuje z gotowym materiałem:
| Parametr | aiStandardSurface | PxrSurface | Znaczenie różnicy |
|---|---|---|---|
| Base/Diffuse Color | 0,8 | 0,18 | PxrSurface startuje dużo ciemniej (18% szarości) |
| Specular | waga 1, biały | Face i Edge Color czarne | brak jakiegokolwiek specularu, dopóki nie ustawisz koloru |
| Specular Model | zawsze GGX | Beckmann | przełącz na GGX, żeby dopasować kształt poświaty |
| Clearcoat Roughness | 0,1 | 0,0 | domyślnie idealne lustro — łatwo przeoczyć na chropowatej bazie |
| Subsurface Distance | Scale 1 | MFP 10 | liczba dziesięciokrotnie większa — kopiowanie promienia bez poprawki zamienia skórę w wosk |
Zanim uznasz, że renderer „kłamie”: czy Specular Face Color wciąż jest czarny (brak specularu)? Czy Specular Model wciąż jest na Beckmannie (zły kształt poświaty)? Dla metalu — czy Diffuse Gain wciąż jest powyżej zera? Dla szkła — czy ustawiłeś oba Reflection i Refraction Gain, nie tylko jeden? Dla skóry — czy Mean Free Path Distance wciąż stoi na domyślnym 10? Ta lista wyłapuje większość pierwszych błędów szybciej niż grzebanie w losowych suwakach.
Ten rozdział pokazał cały stos z lotu ptaka. Rozdział 14 schodzi w głąb jednej, najważniejszej warstwy — specularu — i pokazuje, dlaczego IOR dielektryka to jedna liczba, a IOR metalu to dwie, obie zależne od długości fali.