超级采样防盗-联盟
SAA在许多抗锯齿算法中比较昂贵,年代也很久,但方法比较简单。
主要分为两步
1 .寻找边缘
2 .模糊边缘
这是开机自检处理的处理方法,
看看接下来怎么实现
搜索边缘的理由也是为了减少消耗量。 这样,可以只通过边缘进行超级采样,而无需对所有图进行采样。
上一篇文章详细介绍了三种方法: Roberts、Sobel和Canny,其中Sobel最好,所以我们使用Sobel搜索边缘
简单来说,寻找边缘的区别在于滤波器的不同,但都是水平垂直采样
Sobel算子两个滤波器分别计算横向和纵向的灰度
GX是水平滤波器,GY是垂直滤波器,垂直滤波器是水平滤波器旋转90度。
过滤器是3×3矩阵,与图像平面折叠。
如果不存在边,则两个点的颜色非常接近,过滤器返回较小的值。 否则,可以判断为存在边缘。
找到边缘后,可以模糊边缘
模糊边缘使边缘模糊是进行超级采样。 如果取周围的像素点进行混色,则例如常见于SSAAx2、SSAAx4、x8…。 后面的数字是采样点的数量。
我以前翻译过维客的超级采样
模糊边缘的方式(采样方式)有很多种,但比较流行的有几种
网格采样、随机采样、poisson disc采样、抖动算法采样、旋转网格采样
有些方法的采样范围设定为他们边缘的灰度,也就是边缘检测中的g。 g越大,边缘越深,锯齿越明显,因此必须增大采样范围。
尝试网格、随机和旋转采样
网格采样相对简单,但由于过于规则,模糊效果可能不够理想
获取周围的点,进行混色
float4C0=tex2D(_maintex,I.uv_maintexfixed2) 0.5,1 )/_Size ); float4C1=tex2d(_maintex,I.uv _ maintexfixed2(-0.5,1 )/_Size ); float4C2=tex2d(_maintex,I.uv_maintexfixed2) 0.5,-1)/_Size ); float4C3=tex2d(_maintex,I.uv_maintexfixed2(-0.5,-1)/_Size );
然后是随机的。 我个人认为随机效果不太好。 因为像素点有扩散的痕迹,就像边缘被干扰了一样
浮动2 rand uv=0; rand uv=rand (浮动2 (n.x,n.y ); float4C0=tex2D(_maintex,I.uv_maintexfloat2) randuv.x/2,randUV.y )/_Size ); rand uv=rand (浮动2 (-n.x,n.y ); float4C1=tex2D(_maintex,I.uv_maintexfloat2) randuv.x/2,randUV.y )/_Size ); rand uv=rand (浮动2 (n.x,-n.y ); float4C2=tex2d(_maintex,I.uv_maintexfloat2) randuv.x/2,randUV.y )/_Size ); randuv=rand(float2(-n.x,-n.y ); float4C3=tex2D(_maintex,I.uv_maintexfloat2) randuv.x/2,randUV.y )/_Size );
然后是旋转网格的采样。 最佳旋转角度约为Arctan(1/2) ) 26.6。 在这里偷懒,也可以省去周转计算的消耗。 在大致位置取样,效果很好。 span style=’font-size:14px;’ float4C0=tex2D(_maintex,I.uv_maintexfixed2) 0.2/2,0.8 )/_Size ); float4C1=tex2d(_maintex,I.uv_maintexfixed2) 0.8/2,-0.2 )/_Size ); float4C2=tex2d(_maintex,I.uv_maintexfixed2(-0.2/2,-0.8 )/_Size ); float4C3=tex2d(_maintex,I.uv _ maintexfixed2(-0.8/2,0.2 )/_Size ); /span
比较结果
在性能方面SSAA比其他AA稍弱,主要是因为方法是这样的暴力采样
SAA采样方式之间的损失大致相同
都是SSAAx4
无抗锯齿
网格采样
随机抽样
旋转采样
unity下image effect的SSAA消费量与正文大致相同
从其他unity的抗锯齿方法来看,FXAA的消费量最低也在2.8ms左右
所有代码都被GitHub共享了
—–by wolf96 http://blog.csdn.net/wolf96/