哎,VR遊戲的畫質為什麼總是那麼差?

雷鋒網 於 01/03/2016 發表 收藏文章
按:作者王鋭,VR領域資深從業者。

這個遊戲的畫質好差?

圖形渲染畫面的反走樣問題,亦或者稱之為抗鋸齒問題,對於遊戲和圖形應用的開發者而言絕對是一個老生常談的話題。簡單描述的話,走樣問題總是源於圖像採樣率的不足所致。當我們用一張1920x1080的畫面去表達一個複雜的遊戲場景的時候,我們事實上是嘗試用一個個的像素點來描述觀察者眼中所見的幾何模型和材質信息——而後者原本是可以通過精準的數學曲線和曲面去表達的——因此,使用有限的像素點就意味着我們只能從曲面上採集有限幾個位置的信息,來表達這個物體的形象。如果像素點的數量太少,那麼它所呈現的物體可能會是失真、不準確的,而物體的邊緣往往是鋸齒狀的,這正是記錄了不同採樣信息的像素點所留下的痕跡。


(via anteru.net

而這還遠不是問題的全部。另一種形式的走樣問題或許更為讓人頭疼:現代遊戲開發者常用的一種豐富場景細節的手段,叫做法線貼圖(normal mapping),其原理是使用顏色圖像來記錄物體表面的朝向信息,然後將這張圖貼附到原本平整的幾何表面上。在實時運算過程中,我們使用法線貼圖來模擬這個表面的坑窪不平的效果,以及因此反射的光照信息,從而以很小的代價得到逼真的渲染效果。


不過法線貼圖的使用同樣需要一個採樣的過程,即物體表面的每一個點都需要對應於法線貼圖上的一個顏色值。但是在一定的觀察者視角和距離下,因為法線貼圖存在Mipmap後準確度損失的問題,會導致因為法線而計算的高光部分出現斷續和運動閃爍現象。就如下圖中黃色圈所提示的:原本應當是一條直線的高光效果,在圖中是由很多斷續的短線組成,並且這樣的短線會隨着視角的運動而發生變化,產生非常礙事的觀感。


(via selfshadow.com

對於VR內容的參與者來説,這當然是噩夢的開始。試想你戴上頭盔,看到一位輕盈可人的少女向你走來,少女的鬢角髮絲都打上了天然的馬賽克,而她自信的雙眸和光滑的皮膚,在陽光的照耀下閃爍着詭異的線條。再加上尚不能讓人滿意的頭盔分辨率,以及延遲和紗窗效應等種種問題,只會讓玩家迅速產生一種身“不”臨其境的抽離感,無法將自己代入到虛擬的場景當中。

這兩種類型的走樣問題,可以統稱為空間性的走樣(spatial aliasing)。

與之相對應的還有時間性的走樣(temporal aliasing),顧名思義,就是場景隨着時間變化而發生運動的過程中,因為場景渲染對於高速運動的物體的採樣率不夠,因此發生了失真的狀況。這也被稱為車輪效應(wagon-wheel effect),例如在電視畫面中看到汽車飛馳,或者直升機爬升的鏡頭的時候,我們會感覺輪子或者螺旋槳是反向轉動的。

不過放在遊戲場景中,問題可能會更大一些,爆炸,噴射,甚至是VR玩家頭盔的高速轉動,都可能帶來時間性的走樣問題,從而造成場景不自然的跳動,這甚至可能是3D遊戲暈動症的另外一種潛在的影響因素。能否解決這樣的問題,以及如何高效地解決這些看起來簡單卻又暗藏殺機的走樣問題,想必會給越來越多的VR內容開發團隊帶來巨大的挑戰。而這樣的挑戰也許是前所未有的:畢竟傳統的PC和主機遊戲中,玩家並不需要非常高的分辨率和屏幕刷新率參數,只要面對屏幕時沒有大的瑕疵就好;而VR遊戲顛覆式的體驗,眼睛與屏幕的過近距離,則是在另一方面擴大了這些傳統問題的影響,使之可能進一步成為限制開發者腳步的桎梏。


(via and.intercon.ru

古老而有效的手段:MSAA(多重採樣)

最傳統的一種反走樣思想,就是把原本需要渲染的畫面尺寸放大很多倍之後,渲染一張更高分辨率的圖像(這一過程也稱作超採樣,supersample),然後再重新縮小到實際需要的尺寸輸出。在重新輸出的過程中,每個最終的像素結果,在高分辨率的圖上都有多個對應的像素值可以進行加權平均處理,從而提供了各種提升畫面質量和降低畫面鋸齒的可能性(而這個過程被稱作下采樣,downsample)。這一理想狀況下的方案也被稱作SSAA(super-sampling anti-aliasing)。


當然,對於實時渲染的畫面而言,需要被採樣的絕不僅僅是最終的色彩圖像而已,通常還要考慮深度緩存(depth buffer)和模板緩存(stencil buffer)的重採樣,並且對於畫面上的每一個採樣點都要執行一次像素計算(即調用像素着色器,pixel shader),這一切的工作都對顯示設備的帶寬和像素填充率產生了不可忽視的壓力,進而直接影響到實時畫面的渲染效率——而對於VR內容而言,執行效率的保證恰恰是重中之重。這樣的矛盾,無疑是所有從業者的一塊心病。

幸好,現代計算機硬件支持的MSAA(multi-sampling anti-aliasing)並不會單純到對每種採樣點都斤斤計較的程度,它只會對輸出畫面的每個像素執行一次像素計算,並且將結果輸出到這個像素在大圖上的每一個採樣點,混合之後輸出一個平滑的最終結果。


(via confettispecialfx.com

從圖中可以看到,因為示例像素(方框所示)正好位於一個黃色三角形的邊緣,而它對應的深度採樣點(depth sample)有部分在三角形之外,另一部分在三角形之內,因此重新混合輸出的顏色值自然產生了一種模糊的效果,即幾何物體邊緣鋸齒的平滑處理。如果像素點完全處於三角形的內部或者外部,那麼混合後的顏色值與着色器的輸入值將不會有任何變化。

而很多遊戲設置界面中常見的MSAA 2x,MSAA 4x等選項,設置的正是每個像素對應的採樣點的數目。顯而易見,採樣點的數目越多,渲染更大分辨率的中間畫面耗費的資源和時間也就越大,而最終結果則會更加理想。


via 《刺客信條》

MSAA如今基本成為了所有主流三維遊戲必備圖形品質選項之一,毫無疑問,它也會是大部分VR遊戲在考慮提升自身遊戲品質時的首選優化方案——儘管因此會讓本來就捉襟見肘的渲染效率問題更加嚴重,儘管單純的MSAA並不能解決多種其它形式的走樣問題,例如時間性的走樣,以及因為透明貼圖映射而在三角形內部產生的鋸齒。而為了更好地改善這些問題,人們也在不斷努力着,這才有瞭如今同樣廣為人知的FXAA。

放之四海皆準的廉價貨:FXAA

如今的PC顯示硬件性能相比當年早已是突飛猛進了,但是對於移動平台而言,MSAA看起來還是洪水猛獸一般,稍加濫用就會讓整個系統的五臟六腑都被掏空。在這種局面下,足夠簡單和低成本的反走樣方案當然會更受歡迎,比如基於圖像後處理(post processing)的方法。

圖像後處理並不是什麼新鮮的概念,甚至可以用照片的美化過程來做簡單類比。你使用相機拍攝了一張照片(實時渲染得到一幀圖像),然後打開PhotoShop或者美圖秀秀或者其它奇形怪狀的軟件,調整對比度、亮度,去掉紅眼、雀斑,甚至附上LUT之類的高級貨,這都是圖像後處理的具體流程。而這一過程中顯然也可以做一些和改善畫面鋸齒相關的事情,比如,查找看起來像是邊緣的地方,然後把它模糊掉,讓它看起來不是那麼明顯。

這種方案僅僅是使用了標準分辨率的圖像數據,不需要渲染和計算額外的採樣點,因此也不會產生過多的顯存消耗和計算量。無論在PC平台,移動平台,主機平台,還是別的什麼低端設備上,理論上都可以應用此類方法。針對這一目標,NVIDIA提出了一種名為FXAA(fast approximate anti-aliasing)的後處理反走樣方法:首先根據當前渲染結果的深度信息來查找可能的幾何邊緣,然後直接對這些邊緣像素進行平滑處理。這一方法甚至可以直接在NVIDIA的顯卡控制面板中開啟,並且直接作用於所有運行於當前顯示設備的任意程序之上。


然而,我們之所以説這類方法只能獲取“可能”的幾何邊緣,是因為此時在顯卡中已經不存在幾何信息的概念了。真正能夠用數學方法去描述的幾何頂點與三角形,經過了光柵化過程之後,已經轉化成了一張屏幕大小的圖像而已,我們可以從中得到每個像素點對應的顏色值與深度值,並且從中估算像素點原本是否是在三角形的邊緣位置。與MSAA同樣,如果用户使用了透明貼圖來表達邊緣,那麼這一策略將很難收到效果;而那些原本可能不需要平滑的區域,也存在着被“誤傷”的可能性。

並且,類似FXAA這種基於圖像的平滑處理,很多時候也很難滿足現代遊戲玩家刁鑽的口味,很多人的反映是FXAA的畫面結果“很糊”,灰濛濛的好像被沙塵覆蓋。如果再與VR內容面臨的另一個臭名昭著的問題,即紗窗效應(screen-door effect),相結合的話,結果也許會更加讓人頭痛吧。至少從目前看來,單純的後處理反走樣手段是難以填飽VR內容開發者們的飢餓肚皮的。


(via en.wikipedia.org

魔高一尺,道高一丈

在MSAA基礎上發展起來的硬件採樣抗鋸齒方法還有很多,例如解決了顯存數據存儲量過大問題的CSAA(coverage sampling anti-aliasing);或者可以自定義混合方式的CFAA(custom filter anti-aliasing)。而FXAA的同道者和繼承者同樣大有人在,例如預先學習可能的邊緣類型,然後根據樣式查找邊緣的MLAA(morphological anti-aliasing);以及先全局做某個方向的模糊處理,之後從另一個方向查找邊緣信息的DLAA(directionally localized anti-aliasing,如下圖所示)。可謂是八仙過海,各顯神通。


(via and.intercon.ru

而有關法線貼圖產生的走樣問題,也有不少人做出了自己的貢獻。其一就是Toksvig提出的Mipmapping normal maps,他通過一個額外的係數計算,對法線計算的鏡面反射結果進行了修正。而這個修正對於法線貼圖本身的採樣問題會產生一定的補償作用,從而降低了閃爍走樣問題出現的機率(下圖中,右側為Toksvig方法的實現效果,實際運行中基本上去除了法線貼圖的走樣問題)。


(via selfshadow.com

另一種針對法線貼圖問題的解決方法叫做LEAN Mapping,它的解決方案更為合理和嚴謹,並且能夠基本保持高光計算的本來面目,不過其實現要複雜得多,對於實際系統運行效率的影響更是無法忽略。

值得注意的是,上述這些方法都只是針對第一種走樣現象,即空間性的走樣而苦心鑽研的解決方案。那麼對於時間性的走樣,我們是否也有良方呢?幸好,答案是肯定的。

也許不太遙遠的未來:Temporal AA

要解決場景物體隨時間的運動所產生的走樣問題,我們可能需要這樣的一套流程來處理:
引用1、從場景中找到所有高速運動的物體,包括因為觀察者的高速運動而在視野中產生運動的物體;

2、計算這些物體從上一幀到這一幀運動的距離,也就是它的運動速度;

3、光柵化之後,對於結果圖像的每個像素點,找到覆蓋這個點的所有運動物體;

4、去除那些實際上被遮擋的物體的影響因素;

5、根據運動物體的參數,計算和調整當前像素的實際顯示結果。

NVIDIA為GTX600以及更高配置的顯示卡提供的TXAA反走樣方案,則把上述過程所需的信息定義為:上一幀的圖像緩存,本幀的圖像緩存,以及場景的運動向量(motion vector)數據緩存,並且圖像緩存必須是經過了MSAA反走樣處理的,即包含了每個像素點的多重採樣信息,以便完成準確的運動和覆蓋程度計算。


(via gameplorer.de

毫無疑問,這可能是目前效果最為強大的反走樣方法了,它同時解決了大部分空間性走樣和時間型走樣的問題,幾乎可以達到電影級別的抗鋸齒水準,最適合應用到VR內容當中,立竿見影地解決頭盔運動過程中的不適感和鋸齒感。如果未來已來的話,TXAA,抑或其它的Temporal AA手段,絕對會是其中的一份子,儘管對於玩家而言它只是幕後的英雄。

不過,現實往往並不像理想那麼美好,MSAA的性能損耗已經讓VR行業的從業者們難以忽視,再加上一個胃口更大的TXAA,要保證75Hz乃至120Hz的屏幕刷新率就更是難上加難,而移動端目前還頗為孱弱的圖形處理能力,想要把如此強勁的算法流程納入自己的麾下,恐怕現階段還有好長的一段路要走。

當然這裏也存在着一些爭論:時間性的走樣問題源於場景中高速運動的物體或者觀察者自身。一個戴着頭盔卻總是拼命甩頭和雀躍(並且因而產生了temporal aliasing)的玩家,也許並不需要更關心他所目睹的場景是不是有讓人不適的鋸齒;而高速運動的車輪,直升機螺旋槳,或者高級宇宙飛船的隆隆扇葉,也不一定就要出現在遊戲者面前,讓他們感覺眼花繚亂。那麼如果可以從內容製作上就嘗試去迴避這些問題的話,是否就不必像本文一樣太過杞人憂天了呢?也許吧,但是迴避終究不是解決困難的手段;何時亮劍,怎樣亮劍,也許這是所有的從業者在希望與矛盾中艱難前行的時候,都需要思考和遲早面對的一個問題。

(編者注:當然啦,鋸齒其實只是畫質差的一部分因素,還有可能是本來畫質就很差,哈哈==)


資料來源:雷鋒網
作者/編輯:王鋭

留言


請按此登錄後留言。未成為會員? 立即註冊
    快捷鍵:←
    快捷鍵:→