Rozdział 10 przedstawił D (rozkład orientacji fasetek), G (ułamek fasetek nie zasłoniętych sąsiadami) i F (Fresnel — ułamek odbitego światła) jako koncepcje. Ten rozdział daje im konkretne wzory — te, które dosłownie stoją za każdym „Principled”/„Standard Surface” shaderem, jakiego dotknąłeś w Blenderze, Arnoldzie czy Unrealu.
Standardem od połowy 2010. jest rozkład GGX (Trowbridge-Reitz), spopularyzowany przez kursy Disneya o PBR. Mówi, jaka część mikrofasetek ma normalną wystarczająco bliską H, żeby wziąć udział w odbiciu:
Co ten wzór w ogóle liczy. D(H) to nie kolor ani jasność — to „gęstość”: jaka część mikroskopijnych fasetek na powierzchni ma normalną skierowaną dokładnie w stronę H (wektora „w pół drogi” między światłem a kamerą, z Rozdziału 5). Im więcej fasetek tak zwróconych, tym jaśniejszy błysk w tym miejscu.
Rozbijamy wzór na kawałki:
Podstawmy liczby. Patrzymy dokładnie w kierunku idealnego odbicia, więc N·H = 1:
Ten sam wzór, ta sama liczba wejściowa (N·H=1) — tylko jeden parametr α decyduje, czy dostajesz igłę światła czy szeroką, miękką plamę. Dokładnie to widzisz, przesuwając „Roughness” w Blenderze czy Arnoldzie.
Nie pamiętasz, skąd bierze się α = roughness²? Zobacz akapit wyżej w tym rozdziale, albo Podstawy matematyczne po ogólne przypomnienie notacji.
GGX wyróżnia się na tle starszych rozkładów (jak wykładnik Blinn-Phonga z Rozdziału 5) długim „ogonem” — nawet bardzo gładkie materiały zachowują subtelną, miękką poświatę wokół ostrego jądra błysku. To właśnie ten ogon dał GGX-owi przewagę: fotografie realnych materiałów też mają taką poświatę, a starsze modele jej nie miały.
Ten sam parametr, na żywej kuli
Ten sam Roughness co wyżej — teraz renderowany naprawdę, tym samym wzorem D(H), oświetlony jednym miękkim światłem. Przesuń suwak nad krzywą powyżej.
To dokładnie ta sama matematyka co krzywa D(H) wyżej — tylko teraz scałkowana po całej hemisferze światła i naprawdę oświetlona, zamiast odczytywana z wykresu. Wąski, wysoki szczyt D(H) przy niskim α daje ostry, mały błysk; szeroki, niski szczyt przy wysokim α daje rozmyty, przygaszony błysk — ten sam „ogon", o którym mowa wyżej, teraz widoczny na powierzchni, nie na osi wykresu.
Nie każda mikrofasetka zwrócona w stronę H faktycznie bierze udział w odbiciu. Sąsiednia, wyższa fasetka może ją zacienić od strony światła (promień L nigdy nie dociera) albo zamaskować od strony widza (odbity promień nigdy nie dociera do V) — to ten sam mechanizm samo-zacieniania, który poznałeś w Rozdziale 6, tylko teraz w mikroskali i liczony statystycznie, wzorem, bez śledzenia promieni.
Standardowy wybór to człon Smitha, rozdzielony na dwie niezależne części — jedną dla L, jedną dla V:
Mamy trzy człony osobno: D mówi, ile mikrofasetek jest ustawionych pod H, G ile z nich faktycznie widać, a F ile światła taka fasetka odbija pod danym kątem. Cook-Torrance skleja je w jedną BRDF odbicia lustrzanego:
Ten mianownik to najczęściej gubiony element całego modelu. Nie jest współczynnikiem korekcyjnym „na oko” — wynika wprost z przeliczenia gęstości mikrofasetek na gęstość odbicia i to on odpowiada za to, że przy płytkich kątach (gdy N·V dąży do zera) odbicie jaśnieje, zamiast gasnąć razem z cosinusem.
Zwróć uwagę na argument Fresnela: V·H, nie N·V. To odbicie zachodzi na mikrofasetce, więc kąt liczy się od jej normalnej — czyli od H. Shader liczący F od N·V da poprawny wynik tylko dla idealnie gładkiej powierzchni, gdzie H i N się pokrywają.
↑ Rozdział 7 — pełny wzór Schlicka na F, z R0Zostaje ostatnia nowość: F0 (odbicie przy patrzeniu na wprost, z Rozdziału 7) przestaje być stałą — zależy od tego, czy materiał jest dielektrykiem czy metalem:
To jest dosłownie to samo równanie, które Rozdział 10 opisał słowami — teraz z każdym symbolem podłączonym do konkretnego wzoru z poprzednich sześciu rozdziałów. Nic tu nie jest już arbitralne.
„Principled BSDF” w Blenderze, „Standard Surface” w Arnoldzie/USD, materiał „Metallic-Roughness” w glTF, Unrealu i Unity — to wszystko ten sam przepis: GGX + Smith + Schlick + parametryzacja metallic-roughness, czasem z dodatkami (multi-scatter GGX naprawiający utratę energii przy bardzo chropowatych metalach, clearcoat, anizotropia).
↓ Dodatek A — anizotropia, clearcoat, multi-scatter ↓ Dodatek X — a co z chropowatym szkłemα = roughness² to nie szczegół implementacyjny bez znaczenia — właśnie dzięki tej reparametryzacji przesuwanie slidera „Roughness” od 0 do 1 daje wizualnie równomierną progresję błysku, zamiast skoku „ostro / od razu bardzo rozmyto” w pierwszych kilku procentach.
Materiał mamy już kompletny i fizycznie spójny. W następnym rozdziale wracamy do kamery — głębia ostrości i motion blur, czyli efekty, które nie mają nic wspólnego z materiałem, a wszystko z tym, jak w ogóle generujemy promienie z Rozdziału 3.