20年的電玩迷,2年的洋蔥程式設計師,對於沒有電玩的世界可是連想都不敢想像,也希望能借由自己微薄的程式技術,讓大家了解電玩世界的無限趣味~一個菜鳥程式的生活點滴和對程式技術上的小小研究@_@;

Sunday, April 16, 2006

Ambient Occlusion

Ambient Occlusion(以下簡稱AO),是指一個表面上的點在環境光的照射下,被遮掩的成度.這個方式可以在物件表面上產生一個柔和的陰影來更加強調該物件的真實感和燈光的效果.這個demo我分別用了軟體和硬體2種方法還試做,做的方式如下~

Hemispherical visibility test:
如下圖所示,這個做法是以物件表面的一點P為出發點,在該點的法向量N(Normal)範圍的半圓來對外發射很多的假想射線(rays).我們將這些ray是否有接觸到其他面的數據來統計該點的受光程度,越多ray被阻檔的點,它受光的程度就越低.最後再將這每個點的數據儲存在vertex color裡面來使用.



我用了上面的方法,以每個vertex取512個ray來做參考數據,因為是用軟體來算的關係,速度上可以說相當慢@_@;但是算出來的效果確很不錯喔.最後render的結果如下(可以點選來看原尺寸的圖喔^^)~

   

Depth Map Based Ambient Occlusion Lighting:
如下圖所示,第2種方式是用充滿的燈光將物件包圍,從每一個燈光的視角來對物件來生成一張Shadow Map,再以這張Shadow Map當貼圖,以原攝影機的角度來做深度的比較.因為每個燈光的位置都不一樣,所以Shadow Map的比較就和第1種方式的Hemispherical visibility test是差不多的意思.經過所有燈光的Shadow Map的比較之後,就能清楚的了解到每個vertex的受光程度,進而將所有比較的結果以vertex貼圖軸為輸出位置來輸出到一張AO的貼圖.之後只要用這張AO貼圖便可render出結果^^



下圖是用了第2種演算法所得到的結果,由於有了硬體的支援,速度上比第1種要快得太多囉(算一張512x512的AO貼圖只需要幾秒的時間).值得注意的是女神像這張有一些artifacts,會這樣的原因是因為它有些vertex有重覆normal的關係(即使只算diffuse lighting也可以看到那些線),這個問題就沒有出現在羊頭身上,所以使用這種方式,對model的規格也是要注意的

   
女神像的render結果,注意到artifacts了嗎?
   
羊頭~

算出來的AO貼圖大約是這樣子~

Depth Map的算法雖然比Hemispherical visibility test的方式要快上許多,可是仍沒辦法做到real time rendering那樣的程度,現在GPU Gems2已經有另一種可以做到Dynamic AO的方式,所以Depth Map和Hemispherical visibility test已經算是過去式囉~@_@;改天再來好好看看dynamic AO的方法吧^_^;

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home