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