APERTURE · f/#FOCUS DIST · dSHUTTER · [t0,t1]SAMPLES · lens+time
Rozdział 12 / Realizm i jakość obrazu

Efekty kamery: głębia ostrości i motion blur

Kamera z Rozdziału 3 była matematyczną dziurką od klucza — ostrą wszędzie, zamrożoną w jednej chwili. Prawdziwe obiektywy i migawki nie działają tak, a naprawa obu wymaga tylko jednej sztuczki, którą już znasz z Rozdziału 8.

TL;DR
Pass: Problem

Kamera z dziurki od klucza: idealna, ale nierealna

Model z Rozdziału 3 zbiera światło w jednym punkcie — matematycznej dziurce od klucza. Taki punkt daje nieskończoną głębię ostrości: wszystko, blisko i daleko, jest równie ostre. Prawdziwy obiektyw ma aperturę — otwór o pewnej wielkości — więc światło z jednego punktu scentruje się w jeden punkt na sensorze tylko wtedy, gdy ten punkt leży w konkretnej odległości: płaszczyźnie ostrości. Wszystko poza nią rozmywa się w krąg rozmycia.

Lens.focussharp vs blurred
focus_dist = 300 · na sensorze: OSTRO (coc≈0px)
obiekt obiektyw sensor OSTRO
Przesuń odległość ogniskowania — krąg rozmycia (coc) na sensorze rośnie, im dalej punkt zbiegu promieni leży od samego sensora.
Pass: Symulacja

Dysk apertury i losowe próbki

Naprawa jest zaskakująco prosta: zamiast wystrzeliwać promień zawsze z jednego punktu O (eye), losujemy inny punkt startowy na dysku apertury o promieniu lens_radius, ale celujemy wciąż w ten sam punkt na płaszczyźnie ostrości, w odległości focus_dist od kamery.

lens_point = eye + lens_radius · random_w_dysku()
focus_point = eye + focus_dist · D
new_D = normalize(focus_point − lens_point)random_w_dysku() liczony w bazie right/up z Rozdziału 3; im większy lens_radius (mniejsze f-stop), tym silniejsze rozmycie
Aperture.samplessame focal point
lens_radius = 55px
dysk apertury płaszczyzna ostrości
Przesuń lens_radius — sześć różnych punktów startu, wciąż jeden wspólny cel; szerszy dysk daje szerszy wachlarz promieni, czyli silniejsze rozmycie tła po uśrednieniu (Rozdział 8).
Pass: Czas

Motion blur: próbkowanie w czasie

Migawka prawdziwego aparatu jest otwarta przez pewien czas, nie przez zero sekund. Wszystko, co się w tym czasie poruszy, rozmazuje się na kadrze. Symulacja: dla każdej próbki piksela losujemy też moment t w oknie migawki, i sprawdzamy scenę tak, jakby wyglądała właśnie w tym momencie — czyli interpolujemy pozycję poruszających się obiektów (albo samej kamery) między ich pozycją na początku i na końcu klatki.

t = shutter_open + ξ · (shutter_close − shutter_open)
pos(t) = lerp(pos_start, pos_end, (t − shutter_open) / (shutter_close − shutter_open))ξ — losowa liczba z [0,1); ta sama próbka losowa, którą jitterujesz pozycję w pikselu (Rozdział 8) i na aperturze (wyżej), tylko teraz w osi czasu
Motion.streak8 time samples
smuga ≈ 400px
t = shutter_open t = shutter_close
Przesuń czas otwarcia migawki — osiem chwil, każda w połowie przezroczysta, rozsuwa się lub ściska: dokładnie ten sam trik uśredniania co przy antyaliasingu, tylko wzdłuż osi czasu.
Z praktyki

„f-stop” i „Focus Distance” w kamerze Arnolda, RenderMana czy Unreal Cine Camera to dosłownie lens_radius i focus_dist z tego rozdziału. „Shutter Speed” albo „Shutter Angle” to szerokość okna [shutter_open, shutter_close] — szerszy kąt migawki (bliżej 360°) daje więcej rozmycia, tak jak w prawdziwej kamerze filmowej.

Oba efekty dodają się do budżetu próbek z Rozdziału 8: rozmywasz teraz nie tylko krawędzie, ale i całą aperturę, i cały czas trwania klatki, w tej samej liczbie promieni na piksel. Zbyt mało próbek przy dużym rozmyciu ostrości albo ruchu wygląda nie jak gładkie rozmycie, a jak osobny, ziarnisty szum.

Słowniczek
Głębia ostrości (DOF)
Zakres odległości, w którym obraz jest akceptowalnie ostry.
Płaszczyzna ostrości / focus distance
Odległość, na której promienie z apertury zbiegają się idealnie.
Krąg rozmycia (circle of confusion)
Obszar, w jaki rozmywa się punkt poza płaszczyzną ostrości.
Apertura / f-stop
Wielkość otworu obiektywu; większa apertura = silniejsze rozmycie tła.
Motion blur
Rozmycie wynikające z ruchu w czasie otwarcia migawki.
Kąt migawki (shutter angle)
Ułamek czasu klatki, w którym migawka jest otwarta.