mlaa有着和ssao很像的特点,比较简单的技术,很棒的效果。
而且mlaa显然要比ssao有冲击力的多,个人觉得要把msaa干翻了。
先看对比图:
mlaa的产生发展也很有意思,本来是intel的人发明的,估计是要配合larabee的,是一种适合在cpu上做的aa技术。
但是马上被cpu端计算能力过剩的ps3看上了,被实现出来,在战神等游戏里大展宏图。
在后面gpu上也开始改进,sig10上有个文章讲gpu mlaa,但是效率很一般,720p的在gtx295上依旧要3.4ms。
http://www.gamedev.net/community/forums/topic.asp?topic_id=583531
这个具体的文章要在gpu pro2上发表,号称在720p的mlaa在gtx9800上0.44ms,在360上3.4ms----这就基本要把msaa赶出主流技术舞台了。
intel表示鸭梨很大。
原始论文:
http://visual-computing.intel-research.net/publications/mlaa.pdf
之前基本两种AA:
MSAA,2x情况下是2倍color buffer和depth buffer,color buffer是计算1x的,depth计算2x的,根据depth test情况去更新2x color buffer,最后resolve的时候是lerp的方式。
msaa的问题是
- 对于normal等不能直接lerp的东西没法做aa,所以deferred shading在dx9上没法msaa
- 在msaa后面画的particle等东西会有“白边”的问题
- 比较费
edge detect aa----根据color, normal, depth等信息来判断edge,然后blur,效果不好。
mlaa是走edge detect aa路线,道理比较简单,算法大意列一下,细节就是实现的时候查看就好。
mlaa解决的问题是:
- 如何去detect edge
- 如何去blur
文中从只有黑白颜色开始,首先detect相邻像素亮度差别比较大的情况----也叫discontinuity detection
然后在这些差别中寻求一些模式,主要就是L形的边,因为纯横或者纯竖着的边是不需要aa的。
L形的才需要,这些边所在的区域就是需要去aa的地方。
另外注意的就是所谓的边是抽象连续的,不想像素是离散的一个个格子,那么这些边就是有对pixel的分割,有的是5-5开,有的是4-6开这种,这就决定了blend的weight,用这些weight来blend边缘,就完成了aa的过程。
到了非黑白的颜色,彩色的定义difference函数就好。
然后是mlaa的一些能力认真,最后比较下来比8xmsaa略差,强于4xmsaa。
很恐怖了。
mlaa也有一些edge detection aa的公共问题:
- 缓慢变化的场景(camera)看起来会有问题
- 不是边缘的地方,也就是贴图这样的地方有颜色差别大的情况也会被aa掉
但是实际用下来,已经n款游戏证明了其强大的实力,uncharted2,gow3。。。
Practical morphological antialiasing on the GPU
还有这么个文章,给出一个gpu里面做mlaa的算法,但是因为马上有人以绝对优势超越,所以就不深究这个算法了。
而且文中没有给出很多细节,就是一堆名词,好在后面有source code。
只是提到cielab color space中做discontinuity判断。