14
本文作者: 王銳 | 2016-03-01 12:02 |
按:作者王銳,VR領域資深從業(yè)者。
這個游戲的畫質(zhì)好差?
圖形渲染畫面的反走樣問題,亦或者稱之為抗鋸齒問題,對于游戲和圖形應用的開發(fā)者而言絕對是一個老生常談的話題。簡單描述的話,走樣問題總是源于圖像采樣率的不足所致。當我們用一張1920x1080的畫面去表達一個復雜的游戲場景的時候,我們事實上是嘗試用一個個的像素點來描述觀察者眼中所見的幾何模型和材質(zhì)信息——而后者原本是可以通過精準的數(shù)學曲線和曲面去表達的——因此,使用有限的像素點就意味著我們只能從曲面上采集有限幾個位置的信息,來表達這個物體的形象。如果像素點的數(shù)量太少,那么它所呈現(xiàn)的物體可能會是失真、不準確的,而物體的邊緣往往是鋸齒狀的,這正是記錄了不同采樣信息的像素點所留下的痕跡。
(via anteru.net)
而這還遠不是問題的全部。另一種形式的走樣問題或許更為讓人頭疼:現(xiàn)代游戲開發(fā)者常用的一種豐富場景細節(jié)的手段,叫做法線貼圖(normal mapping),其原理是使用顏色圖像來記錄物體表面的朝向信息,然后將這張圖貼附到原本平整的幾何表面上。在實時運算過程中,我們使用法線貼圖來模擬這個表面的坑洼不平的效果,以及因此反射的光照信息,從而以很小的代價得到逼真的渲染效果。
不過法線貼圖的使用同樣需要一個采樣的過程,即物體表面的每一個點都需要對應于法線貼圖上的一個顏色值。但是在一定的觀察者視角和距離下,因為法線貼圖存在Mipmap后準確度損失的問題,會導致因為法線而計算的高光部分出現(xiàn)斷續(xù)和運動閃爍現(xiàn)象。就如下圖中黃色圈所提示的:原本應當是一條直線的高光效果,在圖中是由很多斷續(xù)的短線組成,并且這樣的短線會隨著視角的運動而發(fā)生變化,產(chǎn)生非常礙事的觀感。
(via selfshadow.com)
對于VR內(nèi)容的參與者來說,這當然是噩夢的開始。試想你戴上頭盔,看到一位輕盈可人的少女向你走來,少女的鬢角發(fā)絲都打上了天然的馬賽克,而她自信的雙眸和光滑的皮膚,在陽光的照耀下閃爍著詭異的線條。再加上尚不能讓人滿意的頭盔分辨率,以及延遲和紗窗效應等種種問題,只會讓玩家迅速產(chǎn)生一種身“不”臨其境的抽離感,無法將自己代入到虛擬的場景當中。
這兩種類型的走樣問題,可以統(tǒng)稱為空間性的走樣(spatial aliasing)。
與之相對應的還有時間性的走樣(temporal aliasing),顧名思義,就是場景隨著時間變化而發(fā)生運動的過程中,因為場景渲染對于高速運動的物體的采樣率不夠,因此發(fā)生了失真的狀況。這也被稱為車輪效應(wagon-wheel effect),例如在電視畫面中看到汽車飛馳,或者直升機爬升的鏡頭的時候,我們會感覺輪子或者螺旋槳是反向轉(zhuǎn)動的。
不過放在游戲場景中,問題可能會更大一些,爆炸,噴射,甚至是VR玩家頭盔的高速轉(zhuǎn)動,都可能帶來時間性的走樣問題,從而造成場景不自然的跳動,這甚至可能是3D游戲暈動癥的另外一種潛在的影響因素。能否解決這樣的問題,以及如何高效地解決這些看起來簡單卻又暗藏殺機的走樣問題,想必會給越來越多的VR內(nèi)容開發(fā)團隊帶來巨大的挑戰(zhàn)。而這樣的挑戰(zhàn)也許是前所未有的:畢竟傳統(tǒng)的PC和主機游戲中,玩家并不需要非常高的分辨率和屏幕刷新率參數(shù),只要面對屏幕時沒有大的瑕疵就好;而VR游戲顛覆式的體驗,眼睛與屏幕的過近距離,則是在另一方面擴大了這些傳統(tǒng)問題的影響,使之可能進一步成為限制開發(fā)者腳步的桎梏。
(via and.intercon.ru)
最傳統(tǒng)的一種反走樣思想,就是把原本需要渲染的畫面尺寸放大很多倍之后,渲染一張更高分辨率的圖像(這一過程也稱作超采樣,supersample),然后再重新縮小到實際需要的尺寸輸出。在重新輸出的過程中,每個最終的像素結(jié)果,在高分辨率的圖上都有多個對應的像素值可以進行加權平均處理,從而提供了各種提升畫面質(zhì)量和降低畫面鋸齒的可能性(而這個過程被稱作下采樣,downsample)。這一理想狀況下的方案也被稱作SSAA(super-sampling anti-aliasing)。
當然,對于實時渲染的畫面而言,需要被采樣的絕不僅僅是最終的色彩圖像而已,通常還要考慮深度緩存(depth buffer)和模板緩存(stencil buffer)的重采樣,并且對于畫面上的每一個采樣點都要執(zhí)行一次像素計算(即調(diào)用像素著色器,pixel shader),這一切的工作都對顯示設備的帶寬和像素填充率產(chǎn)生了不可忽視的壓力,進而直接影響到實時畫面的渲染效率——而對于VR內(nèi)容而言,執(zhí)行效率的保證恰恰是重中之重。這樣的矛盾,無疑是所有從業(yè)者的一塊心病。
幸好,現(xiàn)代計算機硬件支持的MSAA(multi-sampling anti-aliasing)并不會單純到對每種采樣點都斤斤計較的程度,它只會對輸出畫面的每個像素執(zhí)行一次像素計算,并且將結(jié)果輸出到這個像素在大圖上的每一個采樣點,混合之后輸出一個平滑的最終結(jié)果。
(via confettispecialfx.com)
從圖中可以看到,因為示例像素(方框所示)正好位于一個黃色三角形的邊緣,而它對應的深度采樣點(depth sample)有部分在三角形之外,另一部分在三角形之內(nèi),因此重新混合輸出的顏色值自然產(chǎn)生了一種模糊的效果,即幾何物體邊緣鋸齒的平滑處理。如果像素點完全處于三角形的內(nèi)部或者外部,那么混合后的顏色值與著色器的輸入值將不會有任何變化。
而很多游戲設置界面中常見的MSAA 2x,MSAA 4x等選項,設置的正是每個像素對應的采樣點的數(shù)目。顯而易見,采樣點的數(shù)目越多,渲染更大分辨率的中間畫面耗費的資源和時間也就越大,而最終結(jié)果則會更加理想。
via 《刺客信條》
MSAA如今基本成為了所有主流三維游戲必備圖形品質(zhì)選項之一,毫無疑問,它也會是大部分VR游戲在考慮提升自身游戲品質(zhì)時的首選優(yōu)化方案——盡管因此會讓本來就捉襟見肘的渲染效率問題更加嚴重,盡管單純的MSAA并不能解決多種其它形式的走樣問題,例如時間性的走樣,以及因為透明貼圖映射而在三角形內(nèi)部產(chǎn)生的鋸齒。而為了更好地改善這些問題,人們也在不斷努力著,這才有了如今同樣廣為人知的FXAA。
如今的PC顯示硬件性能相比當年早已是突飛猛進了,但是對于移動平臺而言,MSAA看起來還是洪水猛獸一般,稍加濫用就會讓整個系統(tǒng)的五臟六腑都被掏空。在這種局面下,足夠簡單和低成本的反走樣方案當然會更受歡迎,比如基于圖像后處理(post processing)的方法。
圖像后處理并不是什么新鮮的概念,甚至可以用照片的美化過程來做簡單類比。你使用相機拍攝了一張照片(實時渲染得到一幀圖像),然后打開PhotoShop或者美圖秀秀或者其它奇形怪狀的軟件,調(diào)整對比度、亮度,去掉紅眼、雀斑,甚至附上LUT之類的高級貨,這都是圖像后處理的具體流程。而這一過程中顯然也可以做一些和改善畫面鋸齒相關的事情,比如,查找看起來像是邊緣的地方,然后把它模糊掉,讓它看起來不是那么明顯。
這種方案僅僅是使用了標準分辨率的圖像數(shù)據(jù),不需要渲染和計算額外的采樣點,因此也不會產(chǎn)生過多的顯存消耗和計算量。無論在PC平臺,移動平臺,主機平臺,還是別的什么低端設備上,理論上都可以應用此類方法。針對這一目標,NVIDIA提出了一種名為FXAA(fast approximate anti-aliasing)的后處理反走樣方法:首先根據(jù)當前渲染結(jié)果的深度信息來查找可能的幾何邊緣,然后直接對這些邊緣像素進行平滑處理。這一方法甚至可以直接在NVIDIA的顯卡控制面板中開啟,并且直接作用于所有運行于當前顯示設備的任意程序之上。
然而,我們之所以說這類方法只能獲取“可能”的幾何邊緣,是因為此時在顯卡中已經(jīng)不存在幾何信息的概念了。真正能夠用數(shù)學方法去描述的幾何頂點與三角形,經(jīng)過了光柵化過程之后,已經(jīng)轉(zhuǎn)化成了一張屏幕大小的圖像而已,我們可以從中得到每個像素點對應的顏色值與深度值,并且從中估算像素點原本是否是在三角形的邊緣位置。與MSAA同樣,如果用戶使用了透明貼圖來表達邊緣,那么這一策略將很難收到效果;而那些原本可能不需要平滑的區(qū)域,也存在著被“誤傷”的可能性。
并且,類似FXAA這種基于圖像的平滑處理,很多時候也很難滿足現(xiàn)代游戲玩家刁鉆的口味,很多人的反映是FXAA的畫面結(jié)果“很糊”,灰蒙蒙的好像被沙塵覆蓋。如果再與VR內(nèi)容面臨的另一個臭名昭著的問題,即紗窗效應(screen-door effect),相結(jié)合的話,結(jié)果也許會更加讓人頭痛吧。至少從目前看來,單純的后處理反走樣手段是難以填飽VR內(nèi)容開發(fā)者們的饑餓肚皮的。
(via en.wikipedia.org)
在MSAA基礎上發(fā)展起來的硬件采樣抗鋸齒方法還有很多,例如解決了顯存數(shù)據(jù)存儲量過大問題的CSAA(coverage sampling anti-aliasing);或者可以自定義混合方式的CFAA(custom filter anti-aliasing)。而FXAA的同道者和繼承者同樣大有人在,例如預先學習可能的邊緣類型,然后根據(jù)樣式查找邊緣的MLAA(morphological anti-aliasing);以及先全局做某個方向的模糊處理,之后從另一個方向查找邊緣信息的DLAA(directionally localized anti-aliasing,如下圖所示)??芍^是八仙過海,各顯神通。
(via and.intercon.ru)
而有關法線貼圖產(chǎn)生的走樣問題,也有不少人做出了自己的貢獻。其一就是Toksvig提出的Mipmapping normal maps,他通過一個額外的系數(shù)計算,對法線計算的鏡面反射結(jié)果進行了修正。而這個修正對于法線貼圖本身的采樣問題會產(chǎn)生一定的補償作用,從而降低了閃爍走樣問題出現(xiàn)的幾率(下圖中,右側(cè)為Toksvig方法的實現(xiàn)效果,實際運行中基本上去除了法線貼圖的走樣問題)。
(via selfshadow.com)
另一種針對法線貼圖問題的解決方法叫做LEAN Mapping,它的解決方案更為合理和嚴謹,并且能夠基本保持高光計算的本來面目,不過其實現(xiàn)要復雜得多,對于實際系統(tǒng)運行效率的影響更是無法忽略。
值得注意的是,上述這些方法都只是針對第一種走樣現(xiàn)象,即空間性的走樣而苦心鉆研的解決方案。那么對于時間性的走樣,我們是否也有良方呢?幸好,答案是肯定的。
要解決場景物體隨時間的運動所產(chǎn)生的走樣問題,我們可能需要這樣的一套流程來處理:
1、從場景中找到所有高速運動的物體,包括因為觀察者的高速運動而在視野中產(chǎn)生運動的物體;
2、計算這些物體從上一幀到這一幀運動的距離,也就是它的運動速度;
3、光柵化之后,對于結(jié)果圖像的每個像素點,找到覆蓋這個點的所有運動物體;
4、去除那些實際上被遮擋的物體的影響因素;
5、根據(jù)運動物體的參數(shù),計算和調(diào)整當前像素的實際顯示結(jié)果。
而NVIDIA為GTX600以及更高配置的顯示卡提供的TXAA反走樣方案,則把上述過程所需的信息定義為:上一幀的圖像緩存,本幀的圖像緩存,以及場景的運動向量(motion vector)數(shù)據(jù)緩存,并且圖像緩存必須是經(jīng)過了MSAA反走樣處理的,即包含了每個像素點的多重采樣信息,以便完成準確的運動和覆蓋程度計算。
(via gameplorer.de)
毫無疑問,這可能是目前效果最為強大的反走樣方法了,它同時解決了大部分空間性走樣和時間型走樣的問題,幾乎可以達到電影級別的抗鋸齒水準,最適合應用到VR內(nèi)容當中,立竿見影地解決頭盔運動過程中的不適感和鋸齒感。如果未來已來的話,TXAA,抑或其它的Temporal AA手段,絕對會是其中的一份子,盡管對于玩家而言它只是幕后的英雄。
不過,現(xiàn)實往往并不像理想那么美好,MSAA的性能損耗已經(jīng)讓VR行業(yè)的從業(yè)者們難以忽視,再加上一個胃口更大的TXAA,要保證75Hz乃至120Hz的屏幕刷新率就更是難上加難,而移動端目前還頗為孱弱的圖形處理能力,想要把如此強勁的算法流程納入自己的麾下,恐怕現(xiàn)階段還有好長的一段路要走。
當然這里也存在著一些爭論:時間性的走樣問題源于場景中高速運動的物體或者觀察者自身。一個戴著頭盔卻總是拼命甩頭和雀躍(并且因而產(chǎn)生了temporal aliasing)的玩家,也許并不需要更關心他所目睹的場景是不是有讓人不適的鋸齒;而高速運動的車輪,直升機螺旋槳,或者高級宇宙飛船的隆隆扇葉,也不一定就要出現(xiàn)在游戲者面前,讓他們感覺眼花繚亂。那么如果可以從內(nèi)容制作上就嘗試去回避這些問題的話,是否就不必像本文一樣太過杞人憂天了呢?也許吧,但是回避終究不是解決困難的手段;何時亮劍,怎樣亮劍,也許這是所有的從業(yè)者在希望與矛盾中艱難前行的時候,都需要思考和遲早面對的一個問題。
(編者注:當然啦,鋸齒其實只是畫質(zhì)差的一部分因素,還有可能是本來畫質(zhì)就很差,哈哈==)
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。