(AcmAAFilter-v0.97-Beta-bin-src.rar.dmg 包含了一个测试的运行程序和它的源代码,一个ACMAA在延迟渲染中基于位图图像使用像素边缘检测的抗锯齿实现)
Github 的完整源码:
https://github.com/sulinhuang/ACMAAFilter
这个演示程序是用ActionScrpt3脚本语言编写的,处理一张1920x1080的位图耗时55-75ms左右,如果用C写估计性能可以x90-x100之间。也就是耗时1ms左右。1000-1200FPS+(建议加载游戏未抗锯齿的PNG无损图片进行测试)

Alpha Computing Mix Anti-Aliasing 透明度计算颜色混合抗锯齿
事实上关于显示器分辨率导致锯齿出现的描述是错误的,参考下面的图片,在有限的图像分辨率中并没有出现锯齿。(抗锯齿也可以参考这个图片)

当前计算机的计算性能是有限的。在实时的游戏中要以极快的速度渲染实时的图像。所以性能是我们主要考量的目标(当然质量也很重要)。我们希望抗锯齿足够的快,同时也质量很好。
这里提出一种使用Alpha图像混合的抗锯齿方案。
优点:此抗锯齿方法计算速度极快,同时质量很好(当斜率越靠近于0/90度时,其质量高于256x SSAA)。锐度可控制。对游戏FPS的影响以现有显卡而言忽略不计。计算量小,此抗锯齿方法以非常小的性能开销实现了高质量抗锯齿。
缺点:未知。
锯齿的出现主要是因为在图像上丢失了某些颜色信息而导致突然的变化,比如从黑到白。而中间没有过渡(图像显示丢失了中间的过渡信息)。事实上是因为中间的图像颜色信息没有被显示出来而导致了锯齿(主要不是分辨率的原因,当然,分辨率越高确实锯齿更不明显)



如果我们要表示一个1像素的黑色线。我们可以在显示器上画1像素的线条。那么假如我们要画一个1/16像素宽度的黑色线呢?如果我们的分辨率足够高。比如横向有16倍,竖向有16倍的分辨率,那当然也可以画一个1像素的线条。那么在当前有限的分辨率中如何画一个1/16宽度的线条?
答案是画一个透明度为:100%/16=6.25%透明度的黑色线条。将前景色(黑色)和背景色(白色)混合。混合比例为6.25%。
这里引申了全篇的一个重要思想。使用前景色占据虚拟的面积的百分比的透明度来混合两种颜色以在有限的分辨率中表示出这种过渡(抗锯齿)。也就是说一个像素显示的颜色应该包含这个像素面积内的所有颜色的混合。混合比例为前景色占据背景色的面积百分比。这里百分比为1/16面积。



三角形斜边的面积计算和显示方法类似:





这个面积在斜边可以被快速近似计算为:如果斜边横向跨越了4个像素。那么Alpha混合的百分比依次为:80% 60% 40% 20%
4/(4+1) = 0.8
3/(4+1) = 0.6
2/(4+1) = 0.4
1/(4+1) = 0.2

如果斜边横向跨越了9个像素。那么Alpha混合的百分比依次为:90% 80% 70% 60% 50% 40% 30% 20% 10%

对于画线条,比如3D游戏中的远景线缆。方法与此类似,只是面积的计算方式不同,显示的方法仍然是按照线缆面积占据单个像素的面积比例的Alpha比例来混合线缆颜色和背景色。
在单色像素的最终显示颜色中应该表示出经过这个像素的所有物体的最终Alpha混合后的颜色,Alpha比例为这个物体占据的面积。也就是说这个像素的最终显示颜色包括了所有经过这个像素物体的颜色信息(混合后)。
在分辨率有限显示器DPI不够高时某些斜率中可能还是会有点锯齿,我们可以通过增加这个过渡的区域来使锯齿更不明显:比如上面m=9的情况,我们可以扩大9px为11px来控制锐化/模糊的程度(当然增加越多会越模糊,减少则越锐利)

实际的效果如图:(抗锯齿开关的对比)









如果只处理一半数量的像素,则可以提供一种高速度,质量为一半的模式,在质量为一半的情况下,抗锯齿质量仍然是可接受的:

样例:




附件中包含了一个可以用于测试图像的exe运行文件和它的源代码。noAA的图像边缘检测基于lab色彩空间的L值。




和FXAA的不同之处:


和FXAA,TAA在同个画面的对比:

ACMAA使用基于图像像素边缘检测实现在战地1游戏运行画面的表现情况:



更多战地1画面处理的表现:












