RGB · 3 próbki widmaHERO λ · 1 na ścieżkęSTOKES · 4 liczbyEXT OF · R.7, R.10
Dodatek AM / Zaawansowany transport

Poza RGB: rendering spektralny i polaryzacja

Cała ta książka liczyła światło trzema liczbami. To założenie było tak wygodne, że nikt go dotąd nie zakwestionował — a jest przybliżeniem, i to takim, które w konkretnych, rozpoznawalnych sytuacjach się rozpada. Ten dodatek pokazuje, gdzie dokładnie i co się wtedy robi.

TL;DR
Pass: Trzy próbki

Czym właściwie jest „kolor” w tej książce

Kiedy Rozdział 10 mnożył albedo przez światło kanał po kanale, milcząco zakładał, że trzy liczby wystarczą, żeby opisać, co się dzieje. Fizycznie światło jest rozkładem energii po długościach fali — funkcją ciągłą, nie trójką. Oko sprowadza tę funkcję do trzech wartości, bo ma trzy typy czopków, i właśnie dlatego RGB w ogóle działa: na końcu i tak wszystko trafia do trzech receptorów.

Problem polega na tym, że sprowadzenie do trójki następuje w rendererze na początku, a nie na końcu. Każde mnożenie po drodze — odbicie, załamanie, przejście przez ośrodek — wykonuje się wtedy na trzech liczbach zamiast na widmie. Dopóki żaden z tych kroków nie zależy mocno od długości fali, wynik jest praktycznie taki sam. Gdy zależy, wyniki się rozjeżdżają.

RGB:  (r₁·r₂, g₁·g₂, b₁·b₂)   kontra   widmo:  ∫ S₁(λ)·S₂(λ)·x̄(λ) dλλ — długość fali; S(λ) — widmo (odbicia albo światła) jako funkcja ciągła; x̄(λ) — funkcja dopasowania koloru opisująca czułość oka. Po lewej mnożysz trzy próbki i dopiero to jest wynikiem; po prawej mnożysz całe widma i sprowadzasz do trójki dopiero na samym końcu. Te dwie operacje nie są równoważne
Metamerismdwa widma, ten sam RGB
0 1 400 550 700 nm długość fali λ DWA RÓŻNE WIDMA ODBICIA A B B G R renderer RGB widzi tylko to, co przetnie te trzy linie
Widmo A jest gładkie, widmo B ma dwa wąskie piki — dla oka i dla renderera RGB mogą dać ten sam kolor. Ale gdy zmieni się oświetlenie, każde z nich zareaguje inaczej, bo mnożenie zachodzi na całej krzywej, a nie w trzech punktach. W RGB ta różnica nie ma jak zaistnieć: została wyrzucona, zanim cokolwiek policzono.

Skutek nazywa się metameryzmem: dwa różne widma mogą dawać identyczne RGB w jednym oświetleniu i wyraźnie różne w innym. Tkanina dopasowana kolorystycznie w świetle dziennym rozjeżdża się pod świetlówką — w realnym świecie to codzienność, w rendererze RGB nie ma prawa się wydarzyć, bo informacja o widmie została wyrzucona na wejściu.

Pass: Gdzie RGB pęka

Cztery rozpoznawalne objawy

↓ Dodatek H — dyspersja i aberracja chromatyczna
Pass: Hero wavelength

Jak się to liczy bez płacenia stukrotnie

Naiwne podejście do renderingu spektralnego — policz obraz osobno dla trzydziestu długości fali i złóż wyniki — jest trzydzieści razy droższe i nikt tak nie robi. Rozwiązanie jest dokładnie tym samym chwytem, którym Rozdział 15 poradził sobie z całką po hemisferze: losowaniem.

Skoro długość fali to kolejny wymiar całki, to można ją próbkować tak samo jak kierunek. Każda ścieżka dostaje wylosowaną długość fali — hero wavelength — i jest liczona wyłącznie dla niej, z wagą uwzględniającą prawdopodobieństwo tego wyboru. Uśrednienie wielu ścieżek zbiega się do prawidłowej całki po widmie, dokładnie tak jak uśrednianie kierunków zbiegało do całki po hemisferze.

Koszt pojedynczej ścieżki jest więc porównywalny z RGB. Płaci się szumem: pojawia się dodatkowy wymiar do pokrycia próbkami, więc przy tej samej liczbie próbek obraz jest bardziej zaszumiony, zwłaszcza w miejscach silnie zależnych od długości fali. W praktyce próbkuje się kilka długości naraz wokół tej wylosowanej, żeby ten szum ograniczyć.

To jest powód, dla którego rendering spektralny nie wymaga „innego renderera”. To ten sam path tracer z Rozdziału 15 z jedną dodatkową współrzędną w losowaniu.

Pass: Polaryzacja

Druga rzecz, o której książka milczała

Światło ma jeszcze jedną właściwość, której ta książka nigdzie nie modelowała: kierunek drgań. Fala świetlna drga prostopadle do kierunku lotu, a to, czy drgania są uporządkowane, czy przypadkowe, zmienia sposób, w jaki światło oddziałuje z powierzchniami.

Zjawisko jest pospolite. Odbicie od gładkiej powierzchni dielektrycznej — wody, szkła, lakieru — polaryzuje światło częściowo, a przy pewnym kącie niemal całkowicie. Na tym opiera się filtr polaryzacyjny fotografa: obraca się go tak, żeby wyciął uporządkowane drgania odbicia, zostawiając światło od obiektu. Efekt „zniknęły odblaski z wody” jest realny i wyraźny, a w renderze RGB nieosiągalny.

S = (S₀, S₁, S₂, S₃)Wektor Stokesa — cztery liczby zamiast jednej jasności. S₀ to całkowita jasność, czyli dokładnie ta wielkość, którą liczyła cała ta książka; pozostałe trzy opisują, jak bardzo i w jaki sposób drgania są uporządkowane. Oddziaływanie z powierzchnią przestaje być mnożeniem przez liczbę, a staje się mnożeniem przez macierz 4×4 (macierz Muellera)

Widać stąd, dlaczego polaryzacji nie ma w standardowych rendererach: nie da się jej „dołożyć” jako opcji. Zmienia typ wielkości niesionej przez promień z jednej liczby na czwórkę i typ operacji z mnożenia na mnożenie macierzowe — czyli przebudowuje rdzeń całego silnika. Płaci się za to czterokrotnie większym kosztem transportu, a widać ją w niewielkim ułamku ujęć. Dlatego renderują ją zwykle silniki badawcze i te używane w symulacjach optycznych, a nie w produkcji filmowej.

Z praktyki

Rendering spektralny jest dostępny w kilku silnikach produkcyjnych i badawczych — bywa domyślny tam, gdzie priorytetem jest wierność barwy, a opcjonalny tam, gdzie liczy się czas. Warto wiedzieć, że włączenie go zmienia znaczenie wejść materiału: kolor RGB trzeba wtedy podnieść do widma (upsampling), a ten krok nie jest jednoznaczny — kilka różnych widm daje ten sam RGB, więc renderer wybiera jedno według przyjętej reguły. Stąd drobne różnice barwy między trybem RGB a spektralnym przy identycznych wartościach.

Praktyczna wskazówka: jeśli tęcza w szkle wygląda jak trzy oddzielne paski zamiast płynnego przejścia, to nie jest kwestia liczby próbek, tylko właśnie granicy modelu RGB. Żadna wartość w ustawieniach jakości tego nie naprawi.

Słowniczek
Widmo (SPD)
Rozkład energii światła po długościach fali; funkcja ciągła, nie trójka liczb.
Metameryzm
Dwa różne widma dające ten sam kolor w jednym oświetleniu, a różny w innym.
Hero wavelength
Długość fali wylosowana dla danej ścieżki; sprowadza koszt spektralny do poziomu RGB.
Upsampling widmowy
Podniesienie koloru RGB do widma; niejednoznaczne, stąd drobne różnice barwy.
Wektor Stokesa
Czwórka liczb opisująca jasność i stan polaryzacji światła.
Macierz Muellera
Macierz 4×4 opisująca, jak powierzchnia zmienia wektor Stokesa.
Idź głębiej
Dodatek H — Dyspersja i aberracja chromatyczna Dodatek E — Przestrzenie kolorów, gamma i tone mapping Dodatek T — Radiometria: czym naprawdę jest „L”