SHADOW RAY · ANY-HITBIAS · ε·NOCCLUDED · boolSOFT · N/A
Rozdział 6 / Shading

Cienie: promień cienia w praktyce

Wzór z Rozdziału 5 zakłada, że światło zawsze dociera do punktu trafienia. W tym rozdziale to sprawdzamy — i naprawiamy najbardziej klasyczny bug w historii ray tracingu.

TL;DR
Pass: Drugi promień

Drugi test przecięcia

W Rozdziale 1 promień cienia był intuicją. Teraz mamy wszystko, żeby go zaimplementować: dla punktu trafienia P i każdego światła budujemy nowy promień — origin = P, direction = znormalizowany wektor od P do światła — i puszczamy go przez ten sam test przecięcia, który już masz z Rozdziału 4, dla każdego kształtu w scenie.

Jeśli promień cienia trafi w cokolwiek między P a światłem, punkt jest zasłonięty — pomijamy wkład diffuse i specular tego światła (ambient zostaje). Jeśli nic nie zasłania, światło dociera w pełni. Uwaga na dystans: dla świateł punktowych trzeba ograniczyć t do odległości do światła (t_max) — inaczej obiekt stojący za światłem policzy się jako zasłaniający. Dla świateł kierunkowych (słońce, efektywnie w nieskończoności) t_max jest po prostu bardzo duże.

Shadow.testoccluded?
ZASŁONIĘTE ODSŁONIĘTE P zasłonięte przy t < t_light P brak przecięcia przed t_light
Ten sam test przecięcia co dla promienia pierwotnego — tylko interesuje nas jedynie „tak / nie”.
Pass: Bug

Shadow acne: kiedy powierzchnia cieniuje samą siebie

Liczby zmiennoprzecinkowe mają ograniczoną precyzję. Punkt trafienia P, liczony ze wzoru P(t) = O + t·D, w praktyce nigdy nie leży dokładnie na powierzchni — leży o mikroskopijny kawałek pod nią albo nad nią. Jeśli wypadnie odrobinę pod powierzchnią, promień cienia wysłany z tego punktu natychmiast trafia w tę samą powierzchnię, z której właśnie wyszedł, przy t bliskim zeru.

Efekt: powierzchnia „cieniuje samą siebie” w losowych miejscach — charakterystyczny szum z drobnych, czarnych plamek na oświetlonych częściach obiektu, najbardziej widoczny na krzywiznach (kule, cylindry). To jedna z pierwszych rzeczy, które psują się w każdym pisanym od zera raytracerze — i dlatego ma własną nazwę: shadow acne.

Shadow.acnefloat precision
P (obliczone) powiększenie P (teoria) P_obliczone — self-hit przy t ≈ 0,0001
Błąd rzędu 1e-6 wystarczy, żeby promień cienia trafił we własną powierzchnię, zamiast w światło.
Pass: Naprawa

Rozwiązanie: bias

Standardowa naprawa to bias — przesunięcie punktu startowego promienia cienia o mały kawałek wzdłuż normalnej, na zewnątrz powierzchni, zanim wystrzelisz promień:

shadow_origin = P + ε · Nε — mała stała (np. 1e-4, w skali sceny); wypycha punkt na zewnątrz, żeby uniknąć natychmiastowego samo-trafienia

Dobór ε to kompromis. Zbyt małe — acne wraca. Zbyt duże — cień odkleja się od podstawy obiektu, zostawiając widoczną szczelinę światła pod nim; ten artefakt ma swoją nazwę, peter panning (obiekt „lewituje” nad własnym cieniem). Wiele silników produkcyjnych zamiast przesuwać punkt po prostu odrzuca trafienia z t mniejszym niż epsilon w każdym teście przecięcia — efekt identyczny, implementacja czasem wygodniejsza.

Bias.tradeoffε too small / ok / too big
ε = 8 · OK
OK szczelina
Ten sam obiekt, jeden suwak ε — bias to zawsze kompromis, nigdy „ustaw i zapomnij”: za mało i dostajesz samoocienianie, za dużo i cień odkleja się od obiektu.
Z praktyki

Promienie cienia zwykle nie muszą wiedzieć, co ani jak daleko zasłania światło — tylko czy coś zasłania. To pozwala na optymalizację „any-hit”: traversal BVH może zatrzymać się na pierwszym znalezionym przecięciu, zamiast szukać najbliższego, jak dla promieni pierwotnych. To jedna z pierwszych realnych optymalizacji wydajności w tej książce.

Cienie twarde (hard shadows) z tego rozdziału mają ostrą krawędź, bo światło jest punktowe albo kierunkowe — bez powierzchni. Miękkie cienie (soft shadows) potrzebują świateł o powierzchni (area lights) i wielu próbek promienia cienia na piksel, uśrednianych — to już Monte Carlo, które czeka w Części V.

↓ Dodatek U — kąt bryłowy i geometria sferyczna ↓ Dodatek W — próbkowanie powierzchni światła ↓ Dodatek AE — nie mylić z ambient occlusion: uśrednioną widocznością całej hemisfery, bez żadnego światła
Słowniczek
Promień cienia (shadow ray)
Testowy promień od punktu trafienia do światła.
Bias / offset
Przesunięcie punktu startowego promienia wzdłuż normalnej.
Shadow acne
Samo-zacienianie powierzchni przez błędy precyzji zmiennoprzecinkowej.
Peter panning
Odklejenie cienia od obiektu przy zbyt dużym biasie.
Any-hit query
Test przecięcia zatrzymujący się na pierwszym znalezionym trafieniu.
Cienie twarde / miękkie
Ostra krawędź (światło punktowe) kontra rozmyta (światło powierzchniowe, wymaga próbkowania).
Idź głębiej
Dodatek U — Kąt bryłowy i geometria sferyczna Dodatek W — Transformacja między rozkładami Dodatek AE — Ambient Occlusion Dodatek AL — Light linking i light groups