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
Odbicie zwierciadlane to R = D − 2(D·N)N — ten sam wzór z Rozdziału 5, tylko odwrócony: odbijamy promień, nie światło.
Załamanie rządzi się prawem Snella — kąt załamania zależy od względnego współczynnika załamania (IOR) dwóch materiałów.
Równania Fresnela (w praktyce: aproksymacja Schlicka) mówią, jaka część światła się odbija, a jaka załamuje — to one dają realistyczne szkło i wodę, nie arbitralny „reflectivity slider”.
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
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.
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
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.
Co dalej
Mamy teraz kompletny, rekurencyjny model materiału: diffuse, specular, cienie, odbicia i załamania. Ale jeden promień na piksel wciąż daje poszarpane krawędzie. W następnym rozdziale: antyaliasing i próbkowanie — jak wiele promieni na piksel zamienia postrzępione linie w gładkie.