unity抗锯齿

反锯齿分为两大类:
一 Hardware AA :多重采样,即MSAA, 任何平台都支持
二 Post Process AA: Image处理, 包括 FXAA,SSAA等,  移动平台要求OpenGL ES2.0

测试FPS:爬楼       UI         场景1
无  1.x               45           58
     2.0               31          47

2x MS      1.x     15           55
               2.0     21          45 
4x MS      1.x
               2.0     21         43
8x MS      2.0     21         43
         
FXAA1_PresetA   8           10
FXAA2               8            10
SSAA                 15          8

实时证明,在移动平台上 多重采样比 ImageEffect的AA要效率高很多。 而用几倍的MS对性能影响区别不大,但是高倍数如8x MS就比2x MS 画面提升很多。
结论:建议移动平台上的高端设备开 8x MS.

无AA:
unity抗锯齿_第1张图片

8x Multi Sampling AA
unity抗锯齿_第2张图片


Subpixel:  即一个pixel的RGB中的一个通道。
在Unity ImageEffects里提供的AA算法, 速度快慢依次是 SSAA>NFAA>FXAAII>DLAA然后到其他的FXAA.
对家用机来说,最好的是FXAA III

1.Antialias
主要是边缘模糊.
主要算法是
SSAA: Super-Sampled  Anti-Aliasing
最古老的算法,先渲染高分辨率的大image,然后针对每个最终像素进行多点采样。完成后再down-sample回屏幕的分辨率的image.  每个像素pixel shader的执行次数为N.

MSAA: Multi-Sampled Anti-Aliasing
SSAA的简化版。不同的是,  每个像素pixel shader的执行次数为1 .显卡支持的经典反锯齿方法。节省fill rate,但是耗费内存. Alpha参差不齐。 适合Forward-rendering. 不适合Deferred renderring,因为光照处理在 MSAA完成后.

SMAA:Subpixel Morphological Anti-Aliasing

FXAA:Fast Approximate Anti-Aliasing
比MSAA更好的算法,因为它不忽略多边形及边缘线条,仅仅分析屏幕上的像素。
当它看见像素是人工边缘时,它加以平滑。它使得其他所有全屏反锯齿的方法都被废弃了。
FXAA毕竟是一种“比较廉价”的抗锯齿技术,在大多数的游戏应用中,效果终究不及传统的MSAA(目前很多3D游戏的MSAA都可以设到8倍),适用于性能不高的电脑配置。

作者Timothy Lottes(来自Nvidia)原话:最简易嵌入和使用的反锯齿方法。
2个优势:
(1) 平滑所有屏幕上的像素,包括pixel shader,及 已经经过alpha混合的贴图。而这些是MSAA不能
(2) 非常快, 早期版本的速度都是4X MSAA的两倍。
缺点:
可能会产生你不想要的 模糊,例如要在 UI和HUD 绘制之前 绘制模糊。

FXAA1: 《F.E.A.R 3》、《 永远的毁灭公爵 》、《柯南时代》、《 孤岛危机2 》、《无主之地》
FXAA2: 针对Xbox 360设计的
FXAA3:

FXAA步骤:
unity抗锯齿_第3张图片
(1)图1: 将非线性的RGB颜色数据 转换成标量来估计亮度
(2)图2: 检查本地对比度来避免处理非边缘地带,检查到的边缘为红,黄色代表subpixel锯齿
(3)图3:检查本地对比度来 水平金色,垂直蓝色。确定边缘方向。
(4)图4:得到了边缘方向。最高的对比度 对应 90度的边缘
(5)图5:检查边缘,正向及负向
(6)图6:得到边缘的两端边缘,边缘的像素位置被转入到 垂直于边缘的位置来减少锯齿
(7)图7:根据这个sub-pixel offset,输入贴图被重新采样。
(8)图8:混合

1. 求亮度 Luminance Conversion
float FxaaLuma(float3 rgb)
{
   return rgb.y *(0.587/0.299) + rgb.x;
}

2 Local Contrast Check
检查本点 以及 上下左右4个临点。如果 luma的差小于 luma最大值的一个比例,那么视为没有锯齿

float3 rgbN = FxaaTextureOffset(tex, pos.xy, FxaaInt2( 0,-1)).xyz; float3 rgbW = FxaaTextureOffset(tex, pos.xy, FxaaInt2(-1, 0)).xyz; float3 rgbM = FxaaTextureOffset(tex, pos.xy, FxaaInt2( 0, 0)).xyz; float3 rgbE = FxaaTextureOffset(tex, pos.xy, FxaaInt2( 1, 0)).xyz; float3 rgbS = FxaaTextureOffset(tex, pos.xy, FxaaInt2( 0, 1)).xyz; float lumaN = FxaaLuma(rgbN);

float lumaW = FxaaLuma(rgbW);
float lumaM = FxaaLuma(rgbM);
float lumaE = FxaaLuma(rgbE);
float lumaS = FxaaLuma(rgbS);
float rangeMin = min(lumaM, min(min(lumaN, lumaW), min(lumaS, lumaE)));

float rangeMax = max(lumaM, max(max(lumaN, lumaW), max(lumaS, lumaE))); float range = rangeMax - rangeMin;
if(range <
max(FXAA_EDGE_THRESHOLD_MIN, rangeMax * XAA_EDGE_THRESHOLD)) {

return FxaaFilterReturn(rgbM); } 

3 Sub-pixel Aliasing Test
4 Vetical/Horizontal Edge Test
判断是水平 还是垂直

5 End-of-edge Search
搜寻end of edge

参考文章:
FXAA

Anti-alias的前世今生系列

转: http://blog.sina.com.cn/s/blog_471132920101gvxf.html



你可能感兴趣的:(unity3d)