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.
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.
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.
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ń:
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.
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łaMamy już diffuse, specular i cienie — kompletny, podstawowy model materiału matowego. W następnym rozdziale wracamy do rekurencji z Rozdziału 1: odbicia i załamania, prawo Snella i równania Fresnela — to, co faktycznie odróżnia ray tracing od każdej innej metody renderowania.