Unity 抗锯齿 SSAA 卷积
卷积的理解
一个函数在另一个函数上的加权叠加
最形象的理解:一个人被不停的打巴掌,每打一个巴掌,脸会肿起来,并在一定时间内消除,求时间t时,脸肿的程度
SSAA
SSAA的步骤有两步:计算边缘系数,边缘模糊算法,
计算边缘系数:效果比较好的是Sobel算法,Sobel定义了x与y方向的两个过滤器,至于为什么是这样的矩形,不懂??
但是起码知道,它们总体相加趋于0,根据当前点,以及与其相邻的8个点,组成像素的9宫矩阵;
当下面两个过滤器与像素矩阵做卷积运算,也就大概能得出当前点与周围的差异度
这样当前点的x与y方向的灰度值就是,这个值越大,代表越有可能是边缘,与周围像素差异越大
边缘模糊算法:
该算法是采样当前点周围的点,用上面计算出的Sobel算子,与采样的这些点,做像素插值,得到最终平滑
之后的结果,效果比较好的是旋转网格采样,当然你也可以自定义,去直接采它周围的4个点,或8个点,让这些
点的值做平均,再与当前点做插值。下面是旋转网格采样的计算式(x4采样):
float4 c0 = tex2D(_MainTex, i.uv_MainTex + fixed2(0.2 / 2, 0.8) / _Size); float4 c1 = tex2D(_MainTex, i.uv_MainTex + fixed2(0.8 / 2, -0.2) / _Size); float4 c2 = tex2D(_MainTex, i.uv_MainTex + fixed2(-0.2 / 2, -0.8) / _Size); float4 c3 = tex2D(_MainTex, i.uv_MainTex + fixed2(-0.8 / 2, 0.2) / _Size);
参考