形态抗锯齿技术
形态抗锯齿技术 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号