切換
舊版
前往
大廳
主題

Screen space ambient occlusion(2)

Lumi | 2017-04-16 12:19:43 | 巴幣 0 | 人氣 417

這回還是繼續把以前實作過的效果移植到Vulkan程式上,同樣的事情做兩次就不太有趣了,所以這回稍微變化一下。AO的計算還是沿用Scalable Ambient Obscurance (SAO)中的主要步驟,將AO結果模糊化的部分則參考了HBAO+的作法。
▲SSAO耗時1.9 ms,模糊化 1.3 ms,共3.2 ms

好,做完了…嗎?很遺憾還是有些問題,當物體佔滿整個畫面後,SSAO的耗時可以增加到五倍之多。根源應是來自於SAO演算法中,每個pixel的取樣pattern都不一樣造成的cache miss。幸好有一篇Cache-Efficient Post-Processing似乎能解決我的問題,它先將整個畫面交錯分拆成16張小圖片,用這些小圖片計算AO,最後將結果組合回原尺寸大小。
▲此圖示範了怎麼交錯分拆成四張小圖

實際上MRT(Multiple render target)最多只有8,所以拆成16張小圖時必須用2個draw call。計算AO時,不再是每個pixel都亂數製造取樣pattern,而是一張小圖固定使用一個pattern。使用小圖與新的取樣策略理論上能減少cache miss,甚至能減少記憶體頻寬用量。
機會難得,試一下直接在小圖做模糊會長怎樣:
▲相當於每4 pixel才做一次取樣

這個方法的耗時乍看之下實在很不理想,SSAO只省了0.2 ms,模糊化耗時幾乎沒變,將Normal與Depth資料拆成小圖分別耗時0.1與0.2 ms,將AO組合回原尺寸花了0.16 ms,根本沒賺到還虧本。做了些最佳化後SSAO耗時變為1.6 ms,模糊耗時1.0 ms,勉強能說有些進步。不過嘗試讓物體佔滿螢幕後,才發現SSAO的耗時完全不動如山,這方法真的有用!
因為上圖實在太糊了,所以又改成AO組合回原尺寸後才做模糊:
▲最終版本

創作回應

更多創作