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