Ambient Occlusion in Computer Grafica 3D
La tecnica di Ambient Occlusion (AO) è una tecnica di ombreggiatura (shading) che consente di aggiungere realismo alle scene renderizzate in quanto tiene conto delle "occlusioni" dei volumi e delle mesh per calcolare i riflessi e le attenuazioni dei fasci luminosi.
Ambient Occlusion cerca quindi di simulare il comportamento reale della luce, tenendo in considerazione in particolar modo superfici con materiali non riflettenti che però, per via della loro forma (es: una piega in un tappeto), possono influenzare -anche di poco, ma gli effetti si sommano- l'effetto finale di illuminazione di un oggetto o dell'intera scena.
Per far ciò, AO effettua una simulazione a livello globale, non per vertice o per facce (come fanno invece Phong o Blinn-Phong); l'effetto finale è quello di una illuminazione "velata", "grigia", come l'illuminazione che si ha, nel mondo reale, in una giornata molto nuvolosa, per cui AO non è considerata una tecnica di illuminazione globale (Global Illumination) in senso stretto. Il vantaggio sta nella capacità di fornire, alle immagini rappresentanti mesh "isolate", un maggior senso della profondità, per cui tale tecnica consente di ottenere rendering di visualizzazioni di oggetti di forte impatto visivo.
AO simula quindi l'illuminazione proveniente dal cielo, ma in pratica l'implementazione dell'algoritmo segue il processo opposto: i raggi vengono proiettati DALLA SUPERFICIE VERSO IL CIELO: quelli che riesco a raggiungere il cielo aggiungono luminosità alla superficie di partenza, altrimenti la stessa rimarrà scura.
Ambient Occlusion può essere realizzata anche in tempo reale: questo è successo ad esempio con il videogioco Crysis, dove AO veniva realizzata a tempo di rendering (solo mediante la GPU, non utilizzando la CPU) implementandola come ombreggiatore pixel shader; in quella particolare implementazione -detta Screen Space Ambient Occlusion- il valore di "occlusione ambientale" di ciascun pixel veniva calcolato a partire dal valore di profondità spaziale dei pixel adiacenti, ottenendo così una stima dell'occlusione del pixel ("quanto è coperto dagli altri" ciascun pixel).
In realtà, questo era solo il principio di base, ma l'implementazione fa uso di alcuni "escamotages" per ridurre il numero dei calcoli da effettuare (viene fatto ad esempio uso di un kernel di convoluzione da applicare ai pixel per ridurre l'utilizzo, altrimenti necessario, delle textures) e consentirne l'esecuzione in real time.
Dalla descrizione si capisce che Screen Space Ambient Occlusion non è propriamente una tecnica di Ambient Occlusion, in quanto viene eseguita SULL'IMMAGINE, e non SULLE GEOMETRIE della scena, ma viene utilizzata perché consente di ottenere risultati apprezzabili impiegando solamente la GPU, con performances indipendenti dalla complessità della scena (lavora sui pixel con una "scansione" dell'immagine, non sulle mesh) e ed è possibile inserirla facilmente in una pipeline di rendering 3D, come ad esempio la pipeline di OpenGL.
Proprio perché SSAO lavora sull'immagine, infine, i risultati non sono sempre molto fedeli alla "realtà", in quanto dipendenti in una certa misura dal punto di vista dell'osservatore.
|