Ambient occlusion
# Ambient occlusion

L'ambient occlusion è un metodo di ombreggiatura usato nella computer grafica 3D che contribuisce a conferire realismo ai modelli di riflessione locale in quanto tiene conto dell'attenuazione luminosa in prossimità di volumi occlusi. Diversamente da metodi locali come il Phong shading, l'ambient occlusion è un metodo globale, cioè l'illuminazione di ogni punto è funzione della geometria della scena. Ad ogni modo è un'approssimazione grezza dell'intera illuminazione globale. L'aspetto generato dalla sola ambient occlusion è simile a quello di un oggetto in un giorno nuvoloso.

## Funzionamento

Solitamente l'ambient occlusion viene calcolata tracciando raggi in ogni direzione dalla superficie. I raggi che raggiungono lo sfondo o il "cielo" aumentano la luminosità della superficie, mentre quelli che intercettano un altro oggetto non aggiungono alcuna illuminazione. Di conseguenza i punti circondati da molte altre geometrie vengono renderizzati in ombra, mentre i punti più liberi da ingombri risultano più chiari.

L'ambient occlusion è legata all'accessibility shading, che si basa sulla facilità con cui un certo elemento (polvere, luce ecc...) può raggiungere ogni punto di una superficie (si pensi ad un oggetto poroso in cui i buchi meno accessibili tendono a rimanere coperti di polvere). Ha avuto successo nella produzione di animazioni grazie alla sua relativa semplicità ed efficienza. In gergo ambient occlusion viene chiamato anche "sky light".

Una buona caratteristica di questo metodo di shading è quella di offrire una migliore percezione della forma tridimensionale degli oggetti mostrati. Questo fatto è riportato dai risultati di esperimenti che dimostrano la superiore resa della profondità prodotta da uniforme illuminazione "sky light" diffusa rispetto alla "direct lighting".

L'occlusion $A(x)$ del punto $x$ su una superficie di normale $\mathbf {n}$ può essere calcolata integrando la funzione visibilità sulla semisfera $\Omega$ rispetto alla proiezione dell'angolo solido:

    $A(x)={\frac {1}{\pi }}\int _{\Omega }V(x,\omega )(\omega \cdot \mathbf {n} )\,d\omega$

dove $V(x,\omega )$ è la funzione visibilità di $x$ lungo la direzione $\omega$. L'ambient occlusion vale 0 se il punto è totalmente circondato da oggetti, 1 se ne è totalmente libero.

Nella pratica per approssimare questo integrale vengono utilizzate diverse tecniche, la più diretta è probabilmente quella che prevede l'uso del metodo Monte Carlo per tracciare raggi dal punto $x$ e valutare le intersezioni con la geometria della scena (ray casting). Un altro approccio (più adeguato per l'accelerazione hardware) è quello di rasterizzare le geometrie viste dal punto $x$ (a cui viene assegnato il colore nero) in confronto allo sfondo (a cui viene assegnato il colore bianco) e poi prendere in considerazione una media ponderata delle porzioni rasterizzate. Quest'ultimo metodo è un esempio di approccio "inside-out" (o "gathering"), mentre altri algoritmi (come la depth-map ambient occlusion) utilizzano tecniche di diffusione ottica o "outside-in".

In aggiunta al valore di ambient occlusion, spesso viene generato un vettore bent normal $\mathbf {n} _{b}$ che punta nella media delle direzioni libere da ingombri. Esso può essere usato per trovare la radianza incidente da una environment map per approssimare la luce image-based. Comunque ci sono alcuni casi in cui la direzione del vettore bent normal è una falsa rappresentazione della direzione dominante di illuminazione.

