本文首發(fā)在“內(nèi)核工匠”微信公眾號,歡迎關(guān)注公眾號獲取最新Linux技術(shù)分享。
FSR 1.0是空間濾波算法,分成EASU和RCAS兩部分。EASU是邊緣適配的空間上采樣(Edge Adaptive Spatial
Upsampling),RCAS是健壯對比度適配銳化(Robust Contrast Adaptive Sharpening),從CAS發(fā)展而來。
(資料圖)
Lanczos 采樣及多項(xiàng)式擬合
FSR 1.0 使用了 Lanczos2 函數(shù):
a是Lanczos的核大小,藍(lán)色是a=2,綠色是a=0.2時(shí)的曲線,a越小,變化越劇烈,高頻濾波的效果越強(qiáng)
FSR 1.0 EASU使用多項(xiàng)式進(jìn)行擬合,省去了sin,平方根等耗時(shí)的計(jì)算:
其中 ω用來移動(dòng)控制窗口大小。下圖疊加了多項(xiàng)式和Lanczos2的圖像,可以看到當(dāng) 在0.3附近時(shí),擬合效果較好。
EASU 算法主要流程
分析FsrEasuF()函數(shù),可知EASU算法主要流程:
采樣周圍12個(gè)點(diǎn),計(jì)算各點(diǎn)亮度 以內(nèi)部2x2的四個(gè)點(diǎn)為中心的"+"字型為單位,進(jìn)行4次計(jì)算,使用雙線性插值得到梯度和長度 對梯度,長度等量做校準(zhǔn),為下一步做唄參數(shù) 根據(jù)方向進(jìn)行旋轉(zhuǎn),通過 計(jì)算Lanczos2函數(shù)的波形,得到權(quán)重 權(quán)重和顏色的混合紋理采樣
采樣12個(gè)點(diǎn)b,c,e,f,g,h,i,j,k,l,n,o, 形狀如下:
算法的輸入是屏幕空間整型坐標(biāo),進(jìn)行中心對齊。p0,p1,p2,p3點(diǎn)是歸一化的紋理空間坐標(biāo),在[0,1]之間,它們作為textureGather的輸入坐標(biāo)進(jìn)行采樣。由于每一次只采一個(gè)顏色通道,所以總共有4x3=12次textureGather調(diào)用。算法以f為假想的基準(zhǔn)點(diǎn),F(xiàn)為其左上角整數(shù)坐標(biāo)點(diǎn)。(Vulkan紋理坐標(biāo)t軸向下)
亮度的計(jì)算比較簡單,使用 0.5 ? r + 0.5 ? b + g ,突出綠色通道的作用,值域在 [0, 2]
計(jì)算特征
FsrEasuSetF()函數(shù)被調(diào)用四次,每一次處理一個(gè)"+"字型:
為了和代碼保持一致,這里用s,t,u,v標(biāo)記每次調(diào)用的中心2x2 quad的四個(gè)點(diǎn)之一:
s t
u v
wi ∈[ s , t , u , v ]是中心點(diǎn)落在s,t,u,v四種情況下的權(quán)重,公式如下:
它的分配方式是:
每一次調(diào)用輸入5個(gè)點(diǎn)的亮度值,使用a,b,c,d,e統(tǒng)一標(biāo)記位置之間的相對關(guān)系如下:
則方向矢量 dir 的計(jì)算僅使用水平和垂直相鄰方向,不考慮對角線,+字型中心點(diǎn)也不參與計(jì)算:
以水平方向?yàn)槔紤]下三種亮度變化的情形,顯然1型具有較強(qiáng)的方向性,而3型梯度變化過于劇烈,被忽略。
長度是個(gè)標(biāo)量,單次調(diào)用的計(jì)算方式如下:
經(jīng)過四次FsrEasuSetF 函數(shù)調(diào)用,實(shí)際上 dir和l都做了雙線性插值。
數(shù)值校準(zhǔn)
特征F和Lanczos擬合多項(xiàng)式控制因子ω的映射關(guān)系
代碼流程
12點(diǎn)加權(quán)平均
FsrEasuTapF函數(shù)實(shí)現(xiàn)了每個(gè)點(diǎn)的顏色計(jì)算,累積起來就是12個(gè)點(diǎn)的加權(quán)平均。函數(shù)原型和一個(gè)典型的調(diào)用方式:
void FsrEasuTapF(
inout AF3 aC, // Accumulated color, with negative lobe.
inout AF1 aW, // Accumulated weight.
AF2 off, // Pixel offset from resolve position to tap.
AF2 dir, // Gradient direction.
AF2 len, // Length.
AF1 lob, // Negative lobe strength.
AF1 clp, // Clipping point.
AF3 c)
AF2 v;
v.x = (off.x * (dir.x)) + (off.y * dir.y);
v.y = (off.x * (-dir.y)) + (off.y * dir.x);
旋轉(zhuǎn)公式:
計(jì)算最終顏色
EASU 總結(jié)
EASU實(shí)際上使用了統(tǒng)一的公式處理了邊緣和非邊緣像素。非邊緣像素周邊像素接近,加權(quán)平均;邊緣像素變化較大,做高頻濾波,使用Lanczos2函數(shù),實(shí)際也是加權(quán)平均,只不過權(quán)值是負(fù)值。假設(shè)當(dāng)前像素是P,P點(diǎn)對應(yīng)輸入圖像的像素為Q,以上處理過程實(shí)際是這樣一個(gè)抽象的加權(quán)平均算法:
其中 W ( Qi )的是Q點(diǎn)周圍點(diǎn)的權(quán)值,使用Lanczos2擬合多項(xiàng)式計(jì)算,效果和Bicubic接近,但是性能較好,用了12個(gè)點(diǎn)(Bicublic 16個(gè)點(diǎn))。
RCAS
在EASU放大后,RCAS做銳化,使用的模板為:
它是拉普拉斯算子的變種,這里w為負(fù)半軸權(quán)重。輸出像素計(jì)算公式:
那么 w 如何計(jì)算? RCAS 根據(jù)周圍像素的對比度來計(jì)算。
首先得到+字型的亮度最大值 M 和最小值 m,則 w 的公式為:
其中Scale為上采樣之后的分辨率與原分辨率的比值。
移植和優(yōu)化
FSR 1 畫質(zhì)效果一般,但即便如此,移動(dòng)端延遲也偏高,高幀率的游戲是不適用的,需要進(jìn)行優(yōu)化。這篇文章提到了不少的優(yōu)化方向可供借鑒:
https://atyuwen.github.io/posts/optimizing-fsr/
可以找到代碼 github 找到源碼, 總結(jié)起來有以下幾點(diǎn):
使用半精度 減少紋理采樣次數(shù),考慮只采一個(gè)通道 提前退出 移除deringring 計(jì)算四次 FsrEasuSetF 然后插值改成先插值輸入再調(diào)用一次 FsrEasuSetF,減少大量計(jì)算關(guān)鍵詞:

營業(yè)執(zhí)照公示信息