▲你在看我嗎?你還可以再靠近一點。喔不,再靠近是會出現瑕疵的…
環境光遮蔽也是我早就躍躍欲試的技術之一,原理是附近遮蔽物越多,被照到的光越少
因此看起來會比遮蔽物少的地方還要暗
從2007年SSAO首次應用至今,已經有許多不同計算遮蔽程度的演算法出現
不知是不是我搜尋技巧太差,一直找不到HBAO+的演算法,最多只找到HBAO的投影片
因此轉而去調查CryEngine3用什麼方法,畢竟是這系列引擎最早使用SSAO技術
從GPU Pro 3書中得知CryEngine3所使用的技術名為"Volumetric Obscurance"
從此處順藤摸瓜後,找到了Nvidia於2012年發表的 "Scalable Ambient Obscurance (SAO)"
想看SAO與不同技術之間的畫面有何差異可以點下面的連結
Implementing 3 Screen Space Ambient Occlusion Methods in WebGL
我實作SAO時暫時省略了Hierarchical z pass這個步驟, 這個pass的目的是為了減少cache miss
一方面是覺得除了raw depth buffer外,還要再配置一塊記憶體放linear depth很麻煩
另一方面在我測量效能後發現,SAO即使沒這步驟,performance也讓我很滿意
之後有空應該還是會實作Hierarchical z pass,看看究竟會快多少
另外, paper中的演算法是在view space中計算,我又為了省麻煩而全部改成world space
此技術在近距離觀看時,或是增強陰影效果時還是有難看的瑕疵,只能靠調整參數來避免
不過只要把陰影調淡就幾乎看不出瑕疵
SAO效能會隨著計算面積增加而遞減, 在下圖情形下, 我的GTX460約需時2.4ms左右
如果將攝影機拉到極近,使計算面積涵蓋整個螢幕, SAO計算時間會增加至5.9ms
▲SAO開啟
▲SAO關閉