morphological antialiasing

 

mlaa有着和ssao很像的特点,比较简单的技术,很棒的效果。

而且mlaa显然要比ssao有冲击力的多,个人觉得要把msaa干翻了。

 

先看对比图:

morphological antialiasing_第1张图片

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判断。

 


原文链接: http://blog.csdn.net/ccanan/article/details/5954812

你可能感兴趣的:(morphological antialiasing)