形態抗鋸齒技術
形態抗鋸齒技術 SMAA(Enhanced subpixel morphological antialiasing)
一、背景
? ?????SMAA是后處理抗鋸齒技術的一種,基于MLAA形態抗鋸齒技術發展而來。MLAA抗鋸齒流程分為三個pass:邊緣檢測、混合權重因子計算、混合,如下圖所示。

? ?????圖a為輸入圖像,預期近似值用紅線勾勒,覆蓋區域用綠色表示。圖b為原始算法中的預定義圖案。圖c為Jimenez實現的GPU預計算的area texture。圖d為檢測到的邊緣。圖e為計算出的覆蓋區域。圖f為最終混合的圖像。 SMAA 算法通過擴展 (b) 和 (c) 來徹底改造整個流程,以實現清晰的幾何特征和對角線處理。局部對比度自適應消除了 (d) 中的偽邊緣。擴展的圖案檢測和精確搜索提高了 (e) 中的準確率。SMAA 可以處理 (f) 中的額外樣本,以實現精確的亞像素特征和時間超采樣。
二、方案
2.1 邊緣檢測 pass
? ?????采用luma 邊緣檢測方案。首先輸入顏色紋理,并設置閾值,根據紋理坐標采樣得到初始像素RGB值,將其乘以luma系數(0.2126,0.7152,0.0722)后得到初始像素luma值。然后類似的,分別計算得到左(-1,0)、上像素(0,-1)的luma值,再分別計算左、上像素和初始像素luma差值delta0。判斷delta0是否大于閾值,如果大于則edges等于1,否則等于0,如果edges的兩個分量都等于0則認為此像素不在邊緣,退出循環。
? ?????SMAA中為了避免將漸變顏色識別為邊緣,加入了局部對比度判斷。首先分別計算得到右(1,0)、下像素(0,1)的luma值,再分別計算右、下像素和初始像素luma差值delta1。再次分別計算得到左左(-2,0)、上上像素(0,-2)和左、上像素luma差值delta2。比較delta0、delta1、delta2得到最大值maxDelta。判斷如果delta0是否大于等于maxDelta,是則edges等于1,否則等于0。

2.2 混合權重計算 pass
? ?????混合權重計算思路如下圖所示:\(C_{opp}\) 處像素上邊界和\(C_{old}\) 處像素下邊界共享混合權重\(a\) ,而\(a\) 根據上一步的edge紋理的邊緣長度和端點樣式查找表得到。

2.2.1 預計算混合權重紋理Area texture
? ?????MLAA中根據采樣像素到左右邊緣線端點距離distance、左端點樣式e1、右端點樣式e2來獲取到采樣像素混合權重。如下圖所示端點樣式分為4種,加上不存在的0.5情況,紋理因此被分為5乘以5的子紋理,每個子紋理大小為采樣最大可達距離(默認為16)

? ?????SMAA中進一步考慮了對角線樣式,如下圖所示左側為MLAA處理的對角線,中間為SMAA處理的對角線。SMAA對角線重矢量化輸入為dr、dl、e1、e2。

? ?????在混合權重計算中,SMAA會先進行對角線模式檢測,然后再進行正交檢測。如果對角線模式檢測失敗,則觸發正交檢測。否則,將使用對角線模式檢測生成的區域。

2.2.2 預計算回退距離紋理Search texture
? ?????SMAA計算混合權重搜索邊緣線端點時,為了應對交叉邊界情況,使用了雙線性插值的方法,將采樣坐標偏離(0.25,0.125)如下圖所示。

? ?????因此,左右端點的樣式共有16種情況 \((\frac{0}{32}、\frac{21}{32}、\frac{7}{32}、\frac{28}{32})(\frac{3}{32}、\frac{24}{32}、\frac{10}{32}、\frac{31}{32})(\frac{1}{32}、\frac{22}{32}、\frac{8}{32}、\frac{29}{32})(\frac{4}{32}、\frac{25}{32}、\frac{11}{32}、\frac{32}{32})\),因此采樣坐標為33個,原始紋理坐標為(66,33)。考慮大部分采樣值都為0,因此裁剪掉部分紋理并將其變為2次冪(64,16)。紋理的采樣值只有(0,1,2)三種情況,也就是回退距離最大為2。
2.2.3 對角線混合權重計算
?????首先判斷當前紋理坐標下采樣的edge紋理顏色g分量(top邊界)是否大于0,是則說明當前位置像素可能存在對角線,否則跳出。然后進入對角線末端像素搜索,首先判斷edge紋理顏色r分量(left邊界)是否大于0,是則說明當前像素存在45°對角線,然后往左下(-1,1)搜索。SMAASearchDiag1函數中首先創建紋理坐標偏移量\(t=vec3(1/w,1/h,1.0)\) 、起始紋理坐標\(coord=vec4(x,y,-1.0,1.0)\),然后不斷循環判斷\(coord.z<最大搜索步長-1\) 且\(coord.w>0.9\) 。
?????其中,
? ?????\(coord.w\) 為新的紋理坐標采樣的edge.rg與vec2(0.5,0.5)的點乘,如果\(coord.w>0.9\) 則說明采樣位置仍然有邊界存在,否則說明到達對角線端點像素循環結束,返回搜索長度d1和端點樣式e1 。因此搜索結束有兩種情況,如果是達到對角線端點結束則將搜索長度再加1。
?????類似的往右上(1,-1)搜索得到另一個方向上對角線長度d2和端點樣式e2。判斷兩側對角線總長度大于2,是則提取邊界樣式。首先聲明端點紋理坐標
? ?????使用端點的紋理坐標雙線性采樣,向右或向上偏移0.25后會有4種結果0.0、0.25、0.75、1.0。通過SMAADecodeDiagBilinearAccess函數發現采樣結果中只有0.25和1時才是左邊界,只有0.75和1時才是上邊界,因此
? ?????上下邊界同時考慮是否存在共有4種情況0、1、2、3,然后對于沒找到對角線端點的強行賦值上下邊界為0
? ?????如此一來,端點樣式共有16種情況。使用AreaTex采樣混合權重時,
?
? ?????需要注意的時,原始AreaTex尺寸為(160,560),其中橫軸方向0到80的左側為正交線混合權重,80到160為對角線混合權重,縱軸方向0到80為subpixel為0的情況。因此對于一般情況對角線混合權重采樣范圍實際上是(80,80)。
? ?????往左上(-1,-1)和右下(1,1)的-45°對角線類似的混合權重可以計算得到。
2.2.4 水平Horizontal混合權重
? ?????首先判斷當前紋理坐標下采樣的edge紋理顏色g分量(top邊界)是否大于0,是則說明存在水平邊界。然后判斷計算的對角線混合權重是否大于0,不是則說明不存在對角線邊界,這樣就繼續進行水平混合權重的獲取。類似的搜索水平邊界端點,首先設置采樣的紋理坐標為
? ?????這樣設置可以通過雙線性插值一次獲取4個單元的紋理值
? ?????然后初始化端點變量\(e=vec2(0.0,1.0)\),進入循環判斷
? ?????對于條件(2)分析可知,4個單元每個取值0或1則有16種紋理值情況\((\frac{0}{32}、\frac{21}{32}、\frac{7}{32}、\frac{28}{32})(\frac{3}{32}、\frac{24}{32}、\frac{10}{32}、\frac{31}{32})(\frac{1}{32}、\frac{22}{32}、\frac{8}{32}、\frac{29}{32})(\frac{4}{32}、\frac{25}{32}、\frac{11}{32}、\frac{32}{32})\),這時考慮到交叉邊界取值范圍,無效值小于\(\frac{25}{32}\)而有效值大于\(\frac{28}{32}\),取平均后等于0.8281,也就是只要采樣結果大于0.8281就證明此紋理單元不在水平端點上。
? ?????條件(3)保證了遇到交叉邊界循環終止。循環時采樣紋理坐標每次水平移動兩個單元
? ?????因此循環結束時,結束的采樣位置到真正水平端點需要平移1-3個單元,首先需要減去采樣的0.25偏移,然后減去共有的1單元偏移,最后使用SearchTex根據水平端點的樣式采樣得到0、1、2這樣的偏移值。類似的搜索到水平另一側的端點,代入水平距離和端點樣式通過Areatexture得到混合權重。
? ?????SMAA中優化了轉角情況,如下圖所示角的交叉邊長度至少為 2 像素(參見第二列像素),而鋸齒輪廓線的交叉邊長度僅為 1 像素(向右呈階梯狀)。除了常規邊緣(紅色)之外,提取擴展交叉邊(橙色)可以區分這兩種情況,從而得到更精確的重新矢量化結果(粉色),而不是圓角(藍色)。

2.3 顏色混合Pass
? ?????由上述過程可知,混合權重紋理每個單元存儲的依次是(0,0)處的上邊界混合權重、(0,1)處的下邊界混合權重、(0,0)處的左邊界混合權重、(-1,0)處的右邊界混合權重。因此最后混合Pass首先采樣(1,0)紋理的左邊界(A通道)的紋理值,然后采樣(0,1)紋理的下邊界(G通道)的紋理值,最后采樣(0,0)紋理的RB通道構成混合權重a。
? ?????判斷是否混合權重都為0.0,是則采樣原本顏色紋理,否則根據權重偏移采樣紋理坐標并采樣值乘以權重。


浙公網安備 33010602011771號