因为TAA要使用上一帧的历史结果,那么在相机移动的时候,颜色就会有残留,出现ghosting(残影)。
由于上一帧历史是累积的,是由上一帧的直接渲染结果和上上帧的结果做了合并,所以ghosting并不是一帧就消失,要累积一段时间才会消失。
处理ghosting有很多方法,比如depth based rejection和velocity weighing, 现在最流行的方法,大概也是最好的方式是用neighbor AABB clip。
1.首先取当前帧,当前像素周围的几个颜色,比如4个颜色,得到最大值和最小值
2.用最大值和最小值构建AABB,(比如RGB空间的包围盒)
3.用这个AABB去clip 上一帧相同位置的像素颜色,把差别比较大的颜色拉得接近
这个做法整体效果不错,但有一个问题非常恶心。就是如果当前帧的颜色比较高频的时候,AABB clip会没有效果。举一个极端的例子:
(0,0,0)
(1,1,1) C (0,0,0)
(1,1,1)
比如当前帧里包含黑白噪声,那么对于一个像素C, 周围的颜色如上图。
得到的AABB,最小值RGB(0,0,0),最大值(1,1,1)
这个AABB已经覆盖了整个RGB空间(LDR),所以拿他对上一帧的历史颜色做clip的时候,所有颜色都在AABB内,颜色都会留下来,结果就是还是有ghosting。
目前还没看到很好的解决方法。去年(2016)SIGGRAPH2016上naughty dog的一个slide提到了一种解决方法:
Temporal Antialiasing in Uncharted 4:http://advances.realtimerendering.com/s2016/s16_Ke.pptx
1.拿stencil 标记这些高频颜色
2.根据stencil,在做TAA的时候跳过这些颜色。这样这块区域就和处理了TAA的区域有明显的差别,边缘有颜色裂缝
3.根据stencil,对这些颜色做模糊。 (因为TAA多少都有模糊,对TAA没有处理的这些区域,单独做模糊可以去掉裂缝)
大概是这个过程。属于比较hack的workaround。看起来还可以,但是,最大的问题是,这种修复方法需要: 见哪儿修哪儿,也就是要靠人肉处理,看到哪个地方有问题,就打标记。缺点如下:
1.人肉工作量可能很大(美术、QA)
2.覆盖度问题。没看到的地方,可能也有问题但是没处理
INSIDE的TAA对ghosting处理的效果要好点,但是整体更加模糊,清晰度没有UE4好。
目前看来TAA效果还可以,但是存在的问题不太好处理,也不支持VR。
MSAA对于deferred管线来说来浪费显存和带宽。
另外也看了UE4的AGAA的ppt,虽然效果不错,但是对渲染管线的侵入和改动太大