DEPTH · ≤ 8IOR · n1 / n2FRESNEL · SchlickTIR · check
Rozdział 7 / Shading

Odbicia i załamania: powrót do rekurencji

To jest dosłownie to, co w 1980 roku opisał Turner Whitted — rekurencyjne odbicia i załamania, wspomniane w Rozdziale 1 jako fundament branży. Mamy już wszystko, żeby to policzyć: promień, normalną i wektory z poprzednich rozdziałów.

TL;DR
Pass: Odbicie

Odbicie: ten sam wzór, nowy kontekst

W Rozdziale 5 odbijałeś kierunek do światła L względem normalnej, żeby policzyć błysk specular. Teraz robimy to samo z samym promieniem D, żeby wystrzelić nowy promień — rekurencyjnie, tak jak zapowiadał diagram z Rozdziału 1.

R = D − 2(D · N)ND — kierunek promienia wchodzącego (znormalizowany); podstaw L' = −D do wzoru z Rozdziału 5 i wyjdzie identyczny wynik

Nowy promień startuje z punktu trafienia — z tym samym biasem wzdłuż N co promień cienia z Rozdziału 6, z tego samego powodu — i ma kierunek R. Wywołujesz na nim tę samą funkcję śledzenia promienia, w której właśnie jesteś: to jest rekurencja. Musi mieć limit — głębokość odbić (bounce depth) z glosariusza Rozdziału 1 — inaczej promień odbijający się między dwoma zwierciadłami nigdy się nie zatrzyma.

Reflection.angleθ_in = θ_out
θ = 55° po obu stronach N
D N R θ θ
Przesuń θ — D i R zostają lustrzanym odbiciem względem N, dokładnie zgodnie z R = D − 2(D·N)N.
Pass: Załamanie

Załamanie: prawo Snella

Gdy promień wchodzi w przezroczysty materiał — szkło, wodę — zmienia kierunek. O ile, mówi prawo Snella, znane jeszcze z fizyki w szkole średniej:

n1 · sin θ1 = n2 · sin θ2n1, n2 — współczynniki załamania (IOR) obu materiałów; θ1, θ2 — kąty od normalnej, po obu stronach granicy

W formie wektorowej, przydatnej w kodzie, z η = n1/n2:

sin²θ2 = η² · (1 − cos²θ1)gdy prawa strona > 1 → całkowite wewnętrzne odbicie (TIR): promień nie może się załamać, cała energia wraca jako odbicie

Typowe wartości IOR, przydatne od razu w node’ach materiału: powietrze ≈ 1,00 · woda ≈ 1,33 · szkło ≈ 1,50 · diament ≈ 2,42.

↓ Dodatek H — a co, gdy IOR zależy od koloru
Snell.lawbend vs TIR
θ1 = 25° · θ2 = 39,3° · θ_kryt = 41,8°
n2 = 1,0 (powietrze, rzadszy) n1 = 1,5 (szkło, gęstszy) θ1 θ2
Promień w gęstszym ośrodku (szkło) trafiający na granicę pod coraz płytszym kątem: do kąta krytycznego się załamuje, powyżej niego cała energia wraca jako odbicie — TIR.
Pass: Fresnel

Fresnel: ile się odbija, ile załamuje

Na każdej granicy dwóch materiałów światło zwykle częściowo się odbija, a częściowo załamuje — proporcje zależą od kąta padania i IOR. To właśnie opisują równania Fresnela. W grafice praktycznie nikt nie liczy ich w pełnej, fizycznej formie — używa się szybkiej aproksymacji Schlicka (1994):

R0 = ((n1 − n2) / (n1 + n2))²
R(θ) = R0 + (1 − R0)·(1 − cosθ)⁵R0 — odbicie przy patrzeniu na wprost (θ=0); reszta narasta gwałtownie w stronę kąta stycznego
Fresnel.curveSchlick approx
n = 1,50 (szkło) · R0 = 0,040
0° 30° 60° 90° kąt padania θ 0 0,5 1,0 R(θ) R0 ≈ 0,04 (szkło)
Przesuń IOR — nawet materiał o niskim R0 przy kącie stycznym odbija praktycznie 100% światła, dlatego okno widziane pod kątem robi się zwierciadłem.
Z praktyki

Node „Fresnel” w Blenderze, Unrealu czy Substance to dosłownie aproksymacja Schlicka z tego rozdziału — artyści dodają go do materiałów nieprzezroczystych, żeby uzyskać rim light / edge highlight, często nie wiedząc, że sięgają po ten sam wzór, który liczy odbicia w szkle.

Podstawowy, rekurencyjny ray tracer Whitteda śledzi oba promienie na każdym przezroczystym trafieniu — odbity i załamany — ważone Fresnelem, i sumuje wyniki. To podwaja liczbę promieni na każdym poziomie rekurencji: przy głębokości 8 to potencjalnie 2⁸ = 256 promieni z jednego pierwotnego trafienia w szkło.

Słowniczek
Odbicie zwierciadlane (R)
R = D − 2(D·N)N.
Prawo Snella
n1·sinθ1 = n2·sinθ2.
Współczynnik załamania (IOR)
n — stosunek prędkości światła w próżni do prędkości w materiale.
Całkowite wewnętrzne odbicie (TIR)
Brak załamania, gdy kąt przekracza kąt krytyczny.
Równania Fresnela
Opisują podział energii między odbicie i załamanie w funkcji kąta.
Aproksymacja Schlicka
Szybki, praktyczny wzór na Fresnela używany w grafice.
Głębokość rekurencji (max depth)
Limit liczby odbić/załamań, zapobiegający nieskończonej pętli.
Idź głębiej
Dodatek H — Dyspersja i aberracja chromatyczna Dodatek X — Rough dielectric BSDF Dodatek AM — Rendering spektralny i polaryzacja