AmbientOcclusion(AO)
AmbientOcclusion(AO)
?? ?AO(Ambient Occlusion)是圖形學領域近來較為流行的用來獲取較為真實的全局光照效果的一種方法。這種方法針對要渲染的全局場景,利用每個渲染像素點周圍的幾何體分布的遮擋信息來確定當前點的AO效果。基于AO的渲染方法可以有效地增強人類視覺系統對場景全局的認知能力[Luft06]。它提供了很好的一種質量和速度間的均衡。
1. AO的理論基礎
?? ?傳統的實現方法,通常使用光線跟蹤的方法從每個可視點發出若干條光線,并與全局場景進行相交測試來得到相應點處的AO值。這些發出的光線通常呈現出半球體的分布。這里的半球體主要是所在點的法向量外部的半球體(由于對于當前點來說,法向量反方向的半球體中的物體對當前點的全局光照效果沒有什么影響,因而不予考慮,這點類似于傳統的輻射度方法),如圖1所示。
?
圖 1
關于在點P處的AO值可以用下述積分方程式來進行描述:
其中的n表示幾何體元在P點處所具有的法向量,V為相應的可見函數,Ω表示相應的半球體空間,ω表示半球體Ω中從P點出發的方向向量。AO值的計算通過對圍繞P點的半球體上的局部AO值進行積分而得到,由此可知可見函數V為二值函數,即其值為0或1,分別表示在p點處不可以或可以看到環境中的其它幾何體元部分。上式中的積分表達意味著在理想狀態下需要發射出無限條光線來計算得到當前點的AO著色值,而這在實踐中通常需要離散化以便其具有實現性(蒙特卡羅積分),
使用上述的方法來進行場景中的AO值計算往往可以得到很不錯的渲染效果,但同時其也具有以下幾條主要的缺點:
a. 代價太大,需要發出真實的光線并進行與場景的相交測試計算。
b. 原始的積分運算太慢,即便是使用離散化后的方式,若是采樣過多的點同樣具有較低的效率。
c. 對原始場景的依賴性較大,同時可能需要較多的預處理操作。
?? ?針對上述這些缺點,于是有學者提出了基于屏幕空間的AO計算(Screen Space Ambient Occlusion),其中最為典型的應用就是CryTek引擎中展示的驚人效果。基于屏幕空間的AO計算是利用渲染硬件的特性,將原始的三維空間問題轉化為2D空間問題,進而實現簡化的目的。同時,這種方法也是當前圖形學領域的研究中常用的一種方法,因為它可以有效地降低原始問題的復雜度,同時又可以很好地利用當前渲染硬件的架構特性,進而提高效率。這種處理思路的最典型方法即是Shadow
Map,以及最近出現的及于SS的體素化、流體仿真、PhotonMapping等。在這些基于屏幕空間的處理中最常使用的一種輔助資源即是由顯示光柵化過程中得到的深度信息圖(DepthBuffer),在基于SS的AO中同樣使用了深度圖來進行相應著色點的AO計算。它將原始三維場景中的空間信息部分地轉化到二維中,進而從二維的紋理中近似地還原出初始三維場景的信息。
SSAO方法的優點主要有以下幾點:
a. 速度較快,由于不需要生成虛擬的光線,并進行與場景的求交測試等操作,因而效率較高。
b. 基于圖像空間,因而算法的處理效率與原始場景的規模無關,只與渲染生成圖像的分辨率有關。
但同時,其也有相應的缺點,最主要的即是由于深度圖只是場景深度信息的一種近似表述,故而會有信息丟失,比如隱藏的物體即無法表述等,這樣就會導致在某些地方無法進行正確的AO計算。此處的示例可見下圖2所示。
圖 2
? ? ? ?
基于SSAO的渲染流程可以歸結為如下幾個主要步驟:
圖 3
? ? ? ? ? ? ?
?? ?其中的SSAO操作部分主要是用著色器來進行實現,這樣不僅可以高效地利用硬件GPU的渲染性能,同時也簡化了算法的實現難度。SSAO著色算法主要進行以下幾點主要操作:
a. 在每個渲染流程中預處理得到當前視點下的深度圖與法向圖,并作為可以訪問的紋理進行存儲。
b. 像素著色器中:在當前的Pixel周圍進行采樣得到采樣點,并還原這些采樣點在3D空間中的坐標位置。
c. 讀取采樣點映射到2D光柵投影空間中的紋理坐標,并訪問相應位置上的深度值與法向值。
d. 比較各個采樣點所對應的深度值與場景投影的深度圖相應點上的深度值間的關系,以便確定當前采樣點所對應的可見函數V(ω.p)。
e. 對所有采樣點所對應的V進行累計即可得到當前像素點所對應的AO值。
圖 4. 利用RayTracing實現的AO效果,其中的采樣率均為32.?
?
?
總結
以上是生活随笔為你收集整理的AmbientOcclusion(AO)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android gpuimage 直播,
- 下一篇: java每日一练——第六天:输入3个整数