Experimentalize TAA with no code

Experimentalize TAA with no code

來自專欄 Grfx.IO49 人贊了文章

自從延遲渲染成為當代遊戲引擎主流渲染架構後, TAA(Temporal AA)就從之前的離線渲染界常規應用轉身變成了實時渲染的一陣時尚. 延遲渲染自身的帶寬消耗導致MSAA變得十分奢侈, 同時FXAA這種本質是檢測輪廓的演算法在某些動態場景下無法很好的反走樣. (我不喜歡用抗鋸齒這個說法, 雖然大多數情況下類似的演算法都是為了消除渲染物體的"階梯式"輪廓邊緣, 但是AA演算法除了消除幾何走樣, 也要消除著色走樣(想想貼圖的mipmap)).

還沒有了解TAA的同學我十分推薦讀下Yang[1]的這篇"鼻祖paper", 該文很好的解釋了TAA的真諦: 正如他的文章名字 - Amortized Supersampling 所說的那樣, 分時漸進超級採樣, 一種把MSAA消耗分攤在多個序列的幀中的演算法, 比 Temproal 這麼抽象的詞好理解多了.

雖然UE4的TAA已經被Karis[2]做的非常好了, 但是我不禁想動手嘗試下TAA最核心的東西, 增強下感官的理解. 同時我的目標也很簡單, 不寫一行代碼, 只用UE4的編輯器來做嘗試, 這麼做的目的只有一個: 方便.

TAA流程中其實最重要的就是Reprojection. 這個在Lasse[3]在GDC中將INSIDE的用法時候說的很清楚了. 我採用的方法跟他類似: 使用Halton Sequence, 差別是他使用了前16組採樣點,而我循環使用了256組採樣點(初始化時生成)。

輸入Index和Base獲取對應的值

在每個Tick里,通過多個SceneCapture使用自定義的投影矩陣捕獲場景,然後使用歷史幀和當前幀混合。

兩幀的差值

如果不差值,你看到的畫面是這樣的:

抖動是正常的,因為我們每一幀都在改動投影矩陣

混合後:

放大後的局部對比

由於不動源碼無法讀寫Velocity Map,所以我也遇到了Ghosting:

https://www.zhihu.com/video/1010911945507176448

關於解決TAA下動態數據的Ghosting, 其實也是TAA工程上急需解決的難點, 目前沒有很完美的方案, 下一個AA會是什麼AA呢?


[1] Lei Yang, Diego Nehab, et al. Amortized Supersampling, 2009.

[2] Brian Karis, High Quality Temporal Supersampling, SIGGRAPH 2014.

[3] Lasse Jon Fuglsang Pedersen, Temporal Reprojection Anti-Aliasing in INSIDE, GDC 2016.

推薦閱讀:

今年有多少獨立遊戲團隊會死掉?
演講實錄!谷得技術總監陳鎮洪教你如何打造自主研發流水線
游門弄斧41——LudumDare41總結
2018 gamejam 《風俗玩偶體驗店》
Unity2017中的Timeline工作流

TAG:虛幻引擎 | 遊戲開發 |