【GPU Zen 1】螢幕空間篇

一、可擴充套件的自適應SSAO

這篇文章介紹了一種以可擴充套件方式實現SSAO的框架,來覆蓋更多的硬體,致力於在不同的質量級別下提供全解析度的AO效果,以下簡稱為ASSAO。

它類似於使用新的取樣kernel的HBAO,實現的預算時間在渲染一幀所需時間的10%內,執行的效率和tap、解析度以及取樣kernel尺寸有關。而其中取樣kernel在螢幕空間大小不僅和它自己尺寸有關,還和相機距離有關,使得SSAO初始方法效率低下,這裡使用交錯處理和深度mip的方法來提高可擴充套件性和效能。

在高預設下的實現過程如下:

【GPU Zen 1】螢幕空間篇

【GPU Zen 1】螢幕空間篇

將輸入深度轉換為線性空間和四張交錯的half視線空間深度,併為half深度生成mip

迴圈遍歷四個half深度並根據輸入法線來生成AO和邊緣,再應用邊緣感知的智慧模糊。這裡有以下技術要點:

計算時基於kernel螢幕大小和取樣偏移來選擇對應深度的mip級別。

【GPU Zen 1】螢幕空間篇

使用的kernel不是泊松圓盤,而是一種經過排序的漸進式取樣盤,使不同的質量預設差別不會太大

【GPU Zen 1】螢幕空間篇

在計算AO時使用隨機取樣和智慧模糊。深度和法線邊緣感知的智慧模糊會防止把邊緣外的畫素一起模糊了。

【GPU Zen 1】螢幕空間篇

【GPU Zen 1】螢幕空間篇

3。 將上一步輸出交錯組合,並應用最終的智慧模糊來生成全解析度的輸出

在低預設下則跳過深度mip和邊緣生成的步驟。

在質量預設的切換中,除了以上提到的之外,還會透過一個有限數量取樣的AO基礎pass來計算重要性貼圖,在之後質量提升時根據它新增更多的取樣

【GPU Zen 1】螢幕空間篇

【GPU Zen 1】螢幕空間篇

二、PS4上的魯棒SSAO

首先回顧AO的計算方程,由可見性和法線點積兩部分組成。在實時中樣本數有限,常常用基於距離的fallout函式替換可見性來產生更平滑結果,但這還不夠,於是在螢幕空間進行計算。

【GPU Zen 1】螢幕空間篇

本文介紹的演算法如下所示:

首先在1/4解析度的緩衝上進行計算生成降取樣影象。

用來計算的降取樣深度儲存在相機空間,線性易於儲存。使用深度重建畫素世界座標

取樣深度和法線,迭代16個樣本來積分AO。以下pB項用來補償取樣離散深度的數值誤差(p對應p畫素在相機空間的z座標,B取決於解析度)

【GPU Zen 1】螢幕空間篇

使用交錯梯度噪聲隨機旋轉Vogel盤或Alchemy螺旋來生成樣本

接下來分別在水平和豎直上對SSAO輸出進行深度感知的模糊,每次使用七個樣本

最後使用雙邊濾波器對模糊的SSAO進行升取樣。在1/4的SSAO和深度各取4個樣本,在全解析度的深度中取一個樣本來對比從而決定權重分佈。

還可以進行以下最佳化:

深度的mip鏈

不使用mip鏈,而是棋盤交錯取樣+時間超級取樣

三、基於Gather的Bokeh景深

在景深效果中一個畫素的模糊程度取決於CoC值,這個值基於畫素到相機的距離來計算,一般根據到相機距離分為若干層ne、nf、f、fb和fe。在實踐中常常對近場易於處理,但對遠場難以處理,因為會使得焦點物體邊緣模糊後變得半透明滲入遠景。解決方法有兩種,第一種是分層儲存畫素但這樣十分昂貴,第二種則是不允許前景存在任何半透明,但這樣會使得前景失焦處不夠模糊,本文則是為了解決該問題,方法是分別渲染近場和遠場CoC並根據需要將其向外模糊或者向內模糊,再根據CoC模糊近場和遠場顏色,來決定混合的效果,其中近場和渲染都分別渲染為四分之一的解析度

【GPU Zen 1】螢幕空間篇

【GPU Zen 1】螢幕空間篇

【GPU Zen 1】螢幕空間篇

主要演算法如下所示

【GPU Zen 1】螢幕空間篇

首先生成CoC。根據nb、ne、fb和fe計算近場和遠場的CoC,並分別存在R通道和G通道。

【GPU Zen 1】螢幕空間篇

接下來是對輸入顏色和CoC降取樣。方法是使用CoC緩衝進行邊緣感知的雙邊降取樣,即對2x2畫素的畫素執行線性插值。這一步輸出三張rt,分別是顏色、CoC以及和CoC相乘的顏色。

【GPU Zen 1】螢幕空間篇

接下來對近場CoC執行模糊。這裡的模糊是向外模糊,即首先模糊後執行最大過濾,然後再進行模糊。

【GPU Zen 1】螢幕空間篇

【GPU Zen 1】螢幕空間篇

之後進行顏色的計算。這裡需要根據深度分別在兩個RT中計算近場和遠場。模糊使用的取樣圖案如下,使用不同的取樣圖案可以形成不同的景深效果。其中在生成遠場時,樣本都被CoC額外加權並使用預乘CoC的顏色來避免滲色。而近場則是普通的模糊。

【GPU Zen 1】螢幕空間篇

【GPU Zen 1】螢幕空間篇

接下來還要進行填充操作。使用上一步的取樣圖案會在相鄰樣本相距一定距離時產生空洞,此時可以使用最大過濾或者對使用的樣本降取樣來填充空洞。

【GPU Zen 1】螢幕空間篇

最後進行合成。先透過比較全解析度的遠場CoC和1/4解析度的遠場CoC來對模糊遠場進行雙邊升取樣,再根據全解析度遠場CoC將模糊遠場和全解析度的顏色混合。然後再對模糊近場進行雙線性升取樣再將它和顏色混合,使用雙線性是為了儘可能使近場滲色。