AMD FSR實(shí)現(xiàn)原理分析

超分辨率(Super-resolution),有時(shí)候又稱作放大(upscale, upsize),是一類提高視頻或圖像分辨率和質(zhì)量的算法。在視頻編輯和圖像處理領(lǐng)域,超分辨率非常常見(jiàn),比如監(jiān)控視頻的處理以及移動(dòng)設(shè)備高分辨率攝像的需求,還有老照片、老電影的高清修復(fù),都會(huì)用到超分辨率的技術(shù)。而在游戲領(lǐng)域,隨著4K/8K分辨率的應(yīng)用和光線追蹤技術(shù)的引入,使用原生分辨率渲染圖像對(duì)于硬件設(shè)備的壓力確實(shí)較高,這時(shí)如果使用低分辨率渲染游戲,再通過(guò)超分辨率技術(shù)使之適應(yīng)如今高分辨率的屏幕,那么僅會(huì)產(chǎn)生少量的畫質(zhì)損失,卻能換來(lái)可觀的幀率提升,必然會(huì)成為次時(shí)代高畫質(zhì)游戲擴(kuò)大銷量的有效手段之一。

近兩年來(lái)顯卡價(jià)格居高不下,很多玩家減緩了升級(jí)的節(jié)奏,只得用各種降低畫質(zhì)的辦法提升老顯卡在新游戲上的幀率。怎樣能免費(fèi)升級(jí)老顯卡的性能,又不至于畫質(zhì)損失很多呢?如今這個(gè)愿望得到實(shí)現(xiàn):AMD發(fā)布了FidelityFX Super Resolution程序庫(kù),目前已經(jīng)有不少游戲?qū)嵮b。那么這項(xiàng)技術(shù)到底是如何工作的,以及對(duì)游戲會(huì)帶來(lái)多少好處?本文將根據(jù)AMD最近開(kāi)源在GPUOpen的FidelityFX FS程序庫(kù)展開(kāi)說(shuō)明,對(duì)圖形技術(shù)感興趣的玩家可以從中了解到相關(guān)知識(shí)。

一、什么是FSR

AMD FidelityFX Super Resolution,簡(jiǎn)稱FSR,中文名稱是“AMD超級(jí)分辨率銳畫技術(shù)”。就是使用超分辨率技術(shù)實(shí)現(xiàn)高分辨率,高品質(zhì)游戲畫面,并顯著提高游戲運(yùn)行效率的一套實(shí)現(xiàn)方法和程序庫(kù)。它免費(fèi)開(kāi)源,跨平臺(tái),針對(duì)硬件進(jìn)行了優(yōu)化,集成到程序也非常簡(jiǎn)單(實(shí)際上只有兩個(gè)文件),最神奇的是,運(yùn)行它并不需要特殊的硬件,甚至如前幾代的Intel CPU內(nèi)集成的核顯,都可以使用該技術(shù)。如果現(xiàn)在你在開(kāi)發(fā)一個(gè)新的次時(shí)代畫面游戲,真是沒(méi)有理由不使用它。

如果要用一句話說(shuō)明白FSR是如何工作的,我個(gè)人總結(jié)了如下公式:

FSR = 放大(Upsacling) + 銳化(Sharpening)

FSR的簡(jiǎn)單理解

是的,就是如此簡(jiǎn)單。在放大的步驟,F(xiàn)SR實(shí)際上通過(guò)算法實(shí)現(xiàn)了對(duì)圖形邊緣的檢測(cè),在放大圖像的同時(shí)盡量保持原有的邊緣,從而實(shí)現(xiàn)超分辨率。往往超分辨率算法會(huì)產(chǎn)生類似模糊或虛影的錯(cuò)誤,F(xiàn)SR使用了一個(gè)銳化步驟來(lái)消除超分辨率的這個(gè)副作用。對(duì)AMD技術(shù)熟悉的朋友大概還記得AMD曾經(jīng)推出過(guò)一個(gè)銳化技術(shù):AMD FidelityFX Contrast Adaptive Sharpening, 簡(jiǎn)稱CAS,沒(méi)錯(cuò),這里復(fù)用了該技術(shù),并對(duì)其進(jìn)行了針對(duì)性優(yōu)化,使得最終的圖像質(zhì)量得以保證。

AMD CAS已經(jīng)廣泛應(yīng)用于各種游戲中,尤其是知名的AAA大作,比如賽博朋克2077和生化危機(jī)8等等。


賽博朋克2077的FSR設(shè)置截圖
生化危機(jī)8的FSR設(shè)置截圖

而FSR在渲染流水線中的位置,大概位于實(shí)際渲染完成以后,部分后處理(Post-processing)之前,你可以把FSR看做是后處理的一部分,只不過(guò)要十分小心FSR在后處理?xiàng)V兴幍奈恢?,避免一些后處理?dǎo)致FSR處理錯(cuò)誤,影響最終的圖像質(zhì)量。

FSR的處理步驟

比如膠片噪點(diǎn)(Film grain)效果,在很多追求電影式畫面的游戲中廣泛使用,該效果產(chǎn)生的噪點(diǎn)就會(huì)影響FSR的發(fā)揮,(FSR會(huì)加強(qiáng)這些噪點(diǎn)的存在感)使得最終畫面出現(xiàn)錯(cuò)誤。

二、超分辨率的算法

超分辨率算法大致可以看做是一種插值算法,簡(jiǎn)單來(lái)說(shuō)就是“無(wú)中生有”的算法。提高圖像的分辨率意味著要向其中添加像素,那么新添加的像素是什么顏色呢?最簡(jiǎn)單最自然的想法,就是在已知的像素中間插值。

當(dāng)前的超分辨率算法可以大致分為兩種:基于數(shù)值插值的方法,和基于AI的方法。許多算法可能要求使用多幀的數(shù)據(jù),為簡(jiǎn)單起見(jiàn),我們?cè)谶@里僅討論使用單幀圖像的情況。

最近點(diǎn)采樣(Nearest neighbor sample)和雙線性插值(Bilinear interpolation)

這兩種方法通常用在普通的貼圖過(guò)濾采樣中,被叫做最近點(diǎn)過(guò)濾和雙線性過(guò)濾。所謂的過(guò)濾,是指模型渲染到屏幕上時(shí)可能被縮放,所以屏幕上的一個(gè)點(diǎn)可能對(duì)應(yīng)貼圖上的多個(gè)像素,也可能是屏幕上的多個(gè)點(diǎn)只能對(duì)應(yīng)貼圖上一個(gè)點(diǎn)。也就是說(shuō)這兩種方法不但可以處理圖像放大,還可以在圖像縮小的時(shí)候發(fā)揮作用。
現(xiàn)如今很少使用這兩種方法來(lái)做超分辨率了,但是這兩種方法是硬件能夠直接支持的方法,也是其他數(shù)值方法的基礎(chǔ),所以在這里做一下簡(jiǎn)單介紹。

最近點(diǎn)采樣方法十分直接,插值出的像素,直接復(fù)用它距離它最近像素的顏色。缺點(diǎn)也很明顯,圖形邊緣會(huì)出現(xiàn)鋸齒狀走樣,俗稱“狗牙”。

雙線性插值更進(jìn)一步,使用周圍4個(gè)像素來(lái)計(jì)算一個(gè)“平均顏色”,可以有效減少鋸齒,但缺點(diǎn)同樣明顯,會(huì)使得圖形邊緣變得模糊不清。

最近點(diǎn)采樣和雙線性插值

兩次立方插值(Bicubic interpolation)

兩次立方方法廣泛應(yīng)用在各種圖像算法中,兩次立方插值實(shí)際上是采樣了更多周圍像素的結(jié)果,通過(guò)對(duì)周圍像素使用不同的權(quán)重,得到的“平均顏色”更加接近應(yīng)有的結(jié)果。

在很多照片處理軟件,數(shù)碼相機(jī)以及手機(jī)攝像組件中,對(duì)數(shù)字圖像的旋轉(zhuǎn)縮放等處理都使用了該方法。該方法的缺點(diǎn)是要采樣更多的像素,運(yùn)算量比較大,通常不會(huì)用在需要實(shí)時(shí)處理的領(lǐng)域。

兩次立方插值

Lanczos插值(Lanczos interpolation)

Lanczos方法也是應(yīng)用廣泛的數(shù)值方法,在物理、機(jī)械、工程、圖像各種領(lǐng)域都有應(yīng)用。FSR正是使用了Lanczos的簡(jiǎn)化方法來(lái)進(jìn)行插值,具體的應(yīng)用方法詳見(jiàn)下文。

Lanczos插值的結(jié)果與兩次立方插值是接近的,但是由于其可以用較少的采樣點(diǎn)達(dá)到近似的效果,因此在實(shí)時(shí)程序中應(yīng)用更廣泛一些。

下圖對(duì)比了各種算法在平面直角坐標(biāo)系下的區(qū)別。

各種算法的核函數(shù)

基于人工神經(jīng)網(wǎng)絡(luò)的方法

基于AI深度學(xué)習(xí)的超分辨率是如今的大熱門話題,通過(guò)選擇合適的神經(jīng)網(wǎng)絡(luò)模型和大量的訓(xùn)練,深度學(xué)習(xí)方法可以產(chǎn)生非常準(zhǔn)確的圖像,尤其是在分辨率放大倍數(shù)特別大的情況下要明顯優(yōu)于純數(shù)值方法。除去超分辨率之外,基于AI深度學(xué)習(xí)的方法還可以提供包括降噪和銳化等額外的效果,而數(shù)值方法則需要更多處理步驟來(lái)實(shí)現(xiàn)。NVIDIA的DLSS就是屬于這一類方法,

NVIDIA DLSS(深度學(xué)習(xí)超采樣Deep Learning Super Sampling)是NVIDIA為其RTX系列顯卡開(kāi)發(fā)的一個(gè)程序庫(kù),可以將低分辨率的游戲畫面轉(zhuǎn)換為高分辨率,使用時(shí)下流行的AI計(jì)算方法去除錯(cuò)誤增加質(zhì)量,實(shí)際上也是跟FSR一樣的功效:既可以超分辨率處理,也可以負(fù)擔(dān)抗鋸齒的任務(wù),DLSS具體的模型算法目前并未公開(kāi)。

神經(jīng)網(wǎng)絡(luò)計(jì)算雖然看起來(lái)高大上,但需要大規(guī)模的并行計(jì)算能力,在超分辨率實(shí)時(shí)應(yīng)用中往往會(huì)擠占本來(lái)就非常緊張的計(jì)算資源。比如NVIDIA的DLSS就是利用圖形渲染時(shí)可能會(huì)閑置的AI計(jì)算核心(Tensor Core)來(lái)計(jì)算超分辨率。而且NVIDIA只允許擁有TensorCore的RTX系列開(kāi)啟DLSS功能,因?yàn)橹苯邮褂猛ㄓ糜?jì)算單元的話可能就會(huì)適得其反,不但效率得不到提升,反而會(huì)拖慢整個(gè)渲染。這也是為什么10系的N卡無(wú)法使用DLSS。

DLSS的工作流程

神經(jīng)網(wǎng)絡(luò)計(jì)算的另一個(gè)弊端就是前期需要大量的數(shù)據(jù)進(jìn)行訓(xùn)練。比如DLSS原始版本和DLSS 2.0就需要使用NVIDIA NGX超級(jí)計(jì)算機(jī)預(yù)先進(jìn)行訓(xùn)練,并且需要開(kāi)發(fā)團(tuán)隊(duì)提供數(shù)千幀超大分辨率的游戲畫面作為訓(xùn)練數(shù)據(jù)輸入。DLSS 2.1及以后的版本神經(jīng)網(wǎng)絡(luò)已經(jīng)穩(wěn)定,所有游戲就統(tǒng)一使用同樣的模型進(jìn)行計(jì)算了。

除以上所列出的以外,還有很多其他算法,比如基于時(shí)序的數(shù)值算法(用于視頻處理),棋盤格渲染(SONY PlayStation4曾經(jīng)有使用過(guò))等等,限于篇幅此處不作展開(kāi)。

三、FSR的原理

上文提到一個(gè)公式,F(xiàn)SR= 放大+銳化,實(shí)際上FSR由兩個(gè)分別負(fù)責(zé)放大和銳化的組件組成:

  • 邊緣自適應(yīng)空間上采樣EASU(Edge Adaptive Spatial Upsampling)
  • 穩(wěn)定對(duì)比度自適應(yīng)銳化RCAS(Robust Contrast Adaptive Sharpening)

EASU的工作原理

EASU是超分辨率的核心。EASU通過(guò)優(yōu)化的采樣策略從原始圖像上取得附近的像素,對(duì)其進(jìn)行插值計(jì)算得到目標(biāo)像素。
其算法有可以大致分為三個(gè)階段:

  1. 一階段:像素采樣

它使用一個(gè)圓形的采樣區(qū)域來(lái)盡量減少采樣的像素,通過(guò)特別計(jì)算的采樣點(diǎn),直接利用硬件支持的雙線性采樣函數(shù)進(jìn)行采樣,最大限度降低采樣次數(shù)。

  1. 二階段:插值計(jì)算

這部分是整個(gè)算法中最復(fù)雜的一部分,首先是積累計(jì)算線性插值的方向和長(zhǎng)度,然后在所有方向上計(jì)算Lanczos插值。此處FSR對(duì)Laczos-2算法進(jìn)行了數(shù)值近似,去掉了原有的三角函數(shù)和開(kāi)方運(yùn)算以提高效率。

  1. 三階段:限制輸出

由于Lanczos-2函數(shù)會(huì)產(chǎn)生值小于0的部分(見(jiàn)圖 各種算法的核函數(shù)),在某些情況下回出現(xiàn)一個(gè)環(huán)形的失真,所以在得到最終結(jié)果后,將結(jié)果限制在臨近4個(gè)像素的最大和最小值之間。

EASU工作流程

另外,對(duì)于支持16bit半精度計(jì)算的硬件,F(xiàn)SR將使用打包的16bit模式(Packed 16bit),可以使得2個(gè)16bit數(shù)據(jù)并行計(jì)算以提高性能;對(duì)于不支持的硬件,將回退到32bit模式,這將造成一定的性能損失。

RCAS的工作原理

AMD的FidelityFX CAS技術(shù),是使用像素點(diǎn)附近的局部對(duì)比度(Local Contrast)對(duì)顏色進(jìn)行調(diào)整,以消除因?yàn)榭逛忼X,圖像拉伸等操作造成的細(xì)節(jié)模糊。

RCAS在此基礎(chǔ)上進(jìn)行了進(jìn)一步的優(yōu)化,去掉了CAS對(duì)圖像拉伸的支持(該功能已經(jīng)由EASU實(shí)現(xiàn)了),并且直接使用最大局部銳度進(jìn)行解算。

RCAS工作流程

由于FSR對(duì)局部變化比較大(高頻)的區(qū)域敏感,所以在FSR處理之前圖像不可以有任何添加噪點(diǎn)的后處理操作,如果有必要還應(yīng)添加抗鋸齒(反走樣)流程。此外FSA還提供了一些額外的功能,如下:

  • 線性膠片顆粒 LFGA (Linear Film Grain Applicator) 用于在縮放圖像后添加膠片顆粒的算法
  • 簡(jiǎn)單可逆調(diào)和映射 SRTM (Simple Reversible Tone-Mapper)線性的動(dòng)態(tài)高范圍(HDR)可逆映射器
  • 時(shí)序能量保存抖動(dòng) TEPD (Temporal Energy Preserving Dither) 一個(gè)將圖像從線性空間轉(zhuǎn)到Gamma 2.0空間的映射器

具體信息請(qǐng)參考相應(yīng)的源碼。

四、應(yīng)用與發(fā)展

FSR的消耗很少,幾年前的硬件都能輕松應(yīng)付,甚至于核心顯卡和移動(dòng)設(shè)備,都可以運(yùn)行。相對(duì)于其他超分辨率算法來(lái)說(shuō),這是FSR的核心優(yōu)勢(shì)。當(dāng)然在超高的放大倍數(shù)下——比如從480P拉伸到4K——FSR可能無(wú)法像AI深度學(xué)習(xí)算法那樣優(yōu)秀,但對(duì)于游戲玩家來(lái)說(shuō),超分辨率本就是在硬件性能不足的情況下所做的妥協(xié),如果再擠出硬件性能去計(jì)算深度學(xué)習(xí),實(shí)在很奇怪,有點(diǎn)拆東墻補(bǔ)西墻的感覺(jué)。(好吧,如果TensorCore能夠普及到所有游戲卡也是不錯(cuò)的事情:P)

另外在移動(dòng)端,越來(lái)越細(xì)膩的高分辨率屏幕和長(zhǎng)續(xù)航時(shí)間的要求給游戲光影渲染帶來(lái)很大挑戰(zhàn),F(xiàn)SR這種基于數(shù)值的方法很可能更適合在移動(dòng)端大放異彩。

總之,F(xiàn)SR對(duì)于玩家和開(kāi)發(fā)者以及硬件廠商來(lái)說(shuō)都是好事情,帶來(lái)的收益顯然比超頻要多,而且還不增加能耗,讓玩家手中的顯卡無(wú)形中提高了1-2個(gè)檔次,這才是技術(shù)升級(jí)最應(yīng)有的初心。

  • 參考資料

https://github.com/GPUOpen-Effects/FidelityFX-FSR

https://github.com/GPUOpen-Effects/FidelityFX-CAS

https://learnopencv.com/super-resolution-in-opencv/

https://wikimili.com/en/Lanczos_resampling

http://www.darktable.org/2012/06/upcoming-features-new-interpolation-modes-and-better-resize/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容