Rozdział 6 nauczył Cię pytać, czy jedno konkretne światło jest zasłonięte. Ambient occlusion zadaje inne pytanie, dla każdego punktu z osobna, bez udziału żadnego światła: jaka część całego nieba nad nim jest w ogóle widoczna? To odpowiedź, która nie zależy od tego, jak akurat oświetlona jest scena — tylko od samej geometrii wokół punktu.
TL;DR
AO to średnia widoczność (visibility) całej hemisfery nad punktem, ważona cosinusem — bez BRDF, bez konkretnego światła, sama geometria.
To specjalny przypadek całki z równania renderowania z Rozdziału 15: f=1 (brak shadingu), L_i zastąpione binarną funkcją „widać / nie widać”.
W produkcji liczysz ją (albo przybliżasz) wszędzie: pieczone AO maps, SSAO w silnikach real-time, dirt/cavity shadery.
Pass: Rozróżnienie
To nie ten sam „occlusion” co w Rozdziale 6
Promień cienia z Rozdziału 6 to jeden test do jednego, konkretnego światła: origin = P, direction = w stronę tego światła, wynik = binarne „zasłonięte / nie” dla tej jednej pary punkt–światło. Ambient occlusion nie pyta o żadne konkretne światło — pyta, jaka część całej hemisfery nad P w ogóle prowadzi gdzieś, zanim coś ją zablokuje. To czysto geometryczna właściwość punktu: dwa identyczne punkty w identycznie oświetlonej scenie mogą mieć bardzo różne AO, jeśli jeden siedzi w rogu pokoju, a drugi na środku otwartej podłogi.
Corner.vs.openhemisphere visibility
Ta sama hemisfera próbek nad P — po lewej większość kierunków kończy się na sąsiedniej ścianie, po prawej prawie wszystkie uciekają.
Pass: Wzór i estymator
Średnia widoczność, ważona cosinusem
Formalnie: dla punktu p, całkujemy po hemisferze Ω zorientowanej wzdłuż normalnej, binarną funkcję widoczności ważoną tym samym cosinusem (N·ω), który zna już równanie renderowania z Rozdziału 15:
AO(p) = (1/π) · ∫_Ω Vis(p,ω) · (N·ω) dωp — punkt, nie kierunek, więc bez wektorowego formatowania; Vis(p,ω) — 1, jeśli promień z p w kierunku ω nic nie napotka (do rozsądnego dystansu), inaczej 0 — celowo NIE nazwane „V”, żeby nie kolidowało z wektorem widza V używanym od Rozdziału 5; przy pełnej widoczności (Vis=1 wszędzie) całka daje dokładnie π, więc AO=1 — w pełni odsłonięte
Estymator Monte Carlo próbkuje ω dokładnie tak, jak Dodatek AD zrobił to dla Lamberta — cosine-weighted (Malley's method) — więc cosinus i π znikają z estymatora tą samą sztuczką:
AO(p) ≈ (1/N) · Σᵢ₌₁ᴺ Vis(p, ωᵢ)po skróceniu zostaje sam odsetek próbek, które nic nie napotkały — identyczna redukcja jak przy pdf(L)=(N·L)/π w Dodatku AD
Ilustracyjnie: 8 próbek nad dwoma punktami z diagramu wyżej
Punkt w rogu: 3 z 8 próbek uciekają, 5 z 8 trafia w ścianę → AO ≈ 3/8 = 0,375
Punkt na otwartej płaszczyźnie: 7 z 8 próbek ucieka → AO ≈ 7/8 = 0,875
8 próbek to za mało dla gładkiego wyniku — w praktyce liczysz ich dziesiątki do setek na piksel, dokładnie z tego samego powodu „więcej próbek = mniej szumu”, co przy sliderze Samples z Podstaw matematycznych.
Z praktyki
„Ambient Occlusion” jako node do pieczenia w Blenderze, mapy AO generowane w Substance Painter/xNormal, „dirt”/cavity shadery w Arnoldzie i V-Rayu (`ambient_occlusion`, VRayDirt) — wszystkie liczą (albo przybliżają) dokładnie tę całkę, często z ograniczonym dystansem promienia, żeby złapać tylko lokalne, drobne zacienienie (szczeliny, krawędzie), a nie duże, odległe bryły. SSAO (Screen-Space Ambient Occlusion) w silnikach real-time to tania wersja tego samego pomysłu — zamiast prawdziwych promieni po hemisferze, próbkuje tylko sąsiedztwo w buforze głębi, więc widzi tylko to, co akurat jest na ekranie (stąd charakterystyczne „znikanie” AO na krawędziach kadru).
Słowniczek
Ambient Occlusion (AO)
Średnia widoczność hemisfery nad punktem, ważona cosinusem; [0,1].
Vis(p,ω)
Binarna funkcja widoczności — 1 (nic nie zasłania) albo 0; celowo nie „V”.
SSAO
Przestrzeni-ekranu przybliżenie AO z bufora głębi, bez prawdziwych promieni.
Dirt / cavity shader
Wariant AO z ograniczonym dystansem promienia, do lokalnego zabrudzenia krawędzi i szczelin.
Co dalej
Dodatek AF ciągnie ten sam pomysł — „policz raz, użyj szybko” — dalej, tym razem dla oświetlenia z environment mapy zamiast dla samej geometrii.