溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

VR是TAA的終結者嗎?

發布時間:2020-06-30 23:23:08 來源:網絡 閱讀:690 作者:theGIbook 欄目:開發技術

在剛剛發布的Unreal Engine 4.14中,其第一個重要的特性就是增加了在VR開發中對Forward Shading的支持。我們都知道在很多方面Deferred Shading都優于Forward Shading,它也是時下主流游戲引擎使用的渲染架構,而僅有在移動等設備中由于缺乏MRT的支持時才不得不選擇Forward Shading,那么為什么Unreal Engine 4會在VR開發中選擇使用Forward Shading?

VR是TAA的終結者嗎?

“The forward renderer supports both multi sample anti-aliasing (MSAA) and temporal anti-aliasing (TAA). In most cases TAA is preferable because it removes both geometric aliasing and specular aliasing. In VR, the constant sub-pixel movement introduced by head tracking introduces unwanted blurriness, making MSAA a better choice.”

這里指出了Deferred Shading的其中一個重要的缺點,那就是不支持MSAA。MSAA一般是由硬件支持的反走樣(anti-aliasing,AA)技術,它在光柵化階段在一個像素區域內對每個像素使用多個深度采樣值,但是每個像素內的這些深度采樣值共享一個著色計算,即是每個像素仍然只執行一次fragment shader的計算,然后計算的結果被復制到每個子深度采樣點上,這樣一個像素內深度測試失敗的子采樣點將不會包含顏色信息,從而能夠更使最終的顏色過渡更平滑。MSAA與SSAA的不同就在于MSAA的每個像素只執行一次著色計算,因此比SSAA具有較大的性能優勢,但是也因此MSAA不能處理由于著色計算中對函數(如高光)采樣不足導致的走樣(如Shader Aliasing),但是由于人眼對于幾何邊緣的敏感度更高于對顏色的敏感度,因此MSAA是一種相當受偏愛的技術。

然而在Deferred Shading中,為了避免無數被深度測試剔除的像素的著色計算,它將著色計算從光照方程中分離出來,并將它延遲到深度測試之后使用單獨的通道進行計算,通過深度測試的那些像素的材質參數被寫入到G-buffer中,這樣Deferred階段就可以使用G-buffer中的材質數據僅對那些通過深度測試的像素進行計算,從而大大增加渲染性能,這也就是Deferred一詞的來歷。然而,MSAA被集成于光柵化階段,也即是生成G-buffer的階段,MSAA輸出的是比屏幕分辨率更高的輸出辨率,因此4xMSAA也就意味著4xG-buffer,這大大增加了顯存的性能開支,更重要的,由于Deferred階段讀取這些G-buffer數據帶來的帶寬占用和內存讀取延遲。

所以,Deferred Shading更偏愛也是目前主流的反走樣技術是TAA,即時間反走樣(temporal anti-aliasing),TAA的思路就是每幀還是執行一個正常的對每個像素執行單次采樣和單次著色的計算,但是它在每一幀對攝像機的位置在屏幕區域內執行一個在一個像素尺寸內的抖動操作,這樣如果將鄰近的多個幀的數據混合起來,就相當于對每個像素執行了多次深度采樣,如下圖所示。TAA相當于SSAA的效果,它將多個采樣點從單幀內的空間分布轉化到時間上,使得每一幀繪制并不會增加多次采樣導致的性能開支,又能達到像SSAA一樣的圖像品質,因此TAA是時下相當受偏愛的一種在Deferred Shading渲染架構下的反走樣技術。

VR是TAA的終結者嗎?

然而TAA技術看似美好,其背后仍然存在很大的問題,這些問題從宏觀角度來講可以分為兩類:即模糊(blur)和重影(ghosting),從原理上講它們其實可以歸為一個問題,即ghosting消除到一定程度就是blur,然而由于TAA的天生特性,這種模糊基本上是無法絕對消除的。

為了混合在一個像素內的多個子采樣點的結果,TAA需要對一個歷史緩沖進行采樣,將歷史顏色和當前幀計算的結果以一定的比例進行混合,當前幀顏色混合的比例越大,則越快逼近最終結構,但是品質更差,反之逼近過程更慢,但是品質更好。但是對歷史顏色的獲取不是一個例如從數組中獲取某個數據的問題,而是一個對紋理進行采樣的問題,因為我們不可能在下一幀得到一個和上一幀完全一模一樣的位置,所以只能使用紋理采樣技術,而紋理的采樣涉及過濾(filtering)的過程,它是對采樣位置周圍一定范圍內的像素的值進行加權混合的結果,所以每次混合計算每個像素融合了周圍比如4個像素的顏色結果,而這4個顏色值則混合了來自它們周圍4個顏色的混合結果,以此類推,隨著時間的推移,TAA中每個像素會包含周圍很大范圍內的顏色的信息,造成了嚴重的模糊現象,如下圖所示。

VR是TAA的終結者嗎?

這種模糊效果可以通過增加當前幀顏色的混合比例來減少歷史顏色的比值而有所緩解,例如下圖所示,或者一些引擎使用銳化過濾器(sharpen filter)來提升鄰近像素的比重,但由于TAA歷史累計以及顏色過濾的特性,本質上這種模糊是不可絕對消除的。

VR是TAA的終結者嗎?

在這個歷史混合過程中,如果每個像素上一幀和當前幀沒有發生太多變化,例如畫面完全是靜態的,則這種累計過濾結果僅會導致模糊現象。然而如果屏幕顏色發生了變化,例如物體移動,則當前幀和上一幀的顏色信息發生了完全的變化,如果我們不能夠區分一個像素內多個子像素之間的這種絕對變化,而仍然將它們混合,則會產生嚴重的重影現象,即一些物體內的顏色被混合近另一個物體內,如下圖所示。

VR是TAA的終結者嗎?

關于重影及模糊相關的問題及弱化方案,請參考《游戲引擎全局光照技術》第4章的內容,本篇僅簡單討論TAA模糊的問題。這種模糊現象在VR開發中會顯得更加嚴重,因為VR頭盔頻繁的移動,以及VR相對普通屏幕對清晰度的更高要求都會進一步放大TAA的模糊問題,所以Unreal Engine 4在最新的版本中針對VR使用了Forward Shading。

那有沒有什么更好的方案用于在Deferred Shading架構中替代TAA,這里筆者能夠想到的就是Nvidia最新的AGAA(Aggregate G-Buffer Anti-Aliasing)技術,Nvidia已經將AGAA技術實現在Unreal Engine 4(還沒有在UE4主分支)當中。與TAA的思路不一樣,AGAA并不累計歷史顏色,因此不存在TAA的歷史累計混合問題,AGAA使用MSAA的思路,在同一幀內使用多個子采樣點,例如8x,由于這在Deferred Shading會導致8x的G-buffer,所以AGAA是利用pre filtering的思路將這8x的材質參數pre filter成2x(或更多,但通常2個足夠)的G-buffer,因此稱作為Aggregate G-Buffer,這樣8x的深度采樣只輸出2x的G-buffer,這樣就減少了G-buffer的內存占用以及導致的帶寬占用性能問題,如下圖所示。

VR是TAA的終結者嗎?

然而AGAA對硬件是有要求的,聚集幾何緩存數據生成階段的主要目的是將n個子采樣點的數據過濾到c個(c<n)聚集中,這需要用到目標無關光柵化(target independent rasterization)技術,這是NVIDIA的NV_framebuffer_mixed_samples擴展提供的一個功能,它可以對深度測試使用更高的采樣率,而對輸出顏色目標使用更低的分辨率,在每個片元著色器僅輸出到c個顏色目標中的一個,這通過一個目標覆蓋的位掩碼設置:NV_sample_mask_override_coverage。

AGAA適用于Deferred Shading,同時沒有時間累積混合的問題,它可以產生媲美SSAA的品質,因此在當前TAA對VR極度不友好,Forward Shading又由于眾所周知的性能問題下,AGAA或許未來會有一定的舞臺。

然而AGAA也是有缺點的,它的主要問題是由于Pre filtering要求每個像素內的材質類型必須一致,否則pre filtering的結果必定是錯誤的,這在當前PBR主流的光照計算中,場景中大部分物體都可以使用統一的一套材質參數表述,因此還是能夠適應大部分場景,少部分特殊材質類型可以使用單獨的渲染通道來解決。另外,Pre filtering還要求光照方程中能夠被Pre filter的參數必須是相互獨立的。這兩個問題是AGAA今后優化發展的重點方向。

本篇僅就Unreal Engine 4引出的TAA的模糊問題的原因及問題展開相關的分析討論,關于本篇的全部詳細內容都可以在《游戲引擎全局光照技術》試讀章節中找到。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女