zoukankan      html  css  js  c++  java
  • [工作积累] TAA Ghosting 的相关问题

    因为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好。

    http://twvideo01.ubm-us.net/o1/vault/gdc2016/Presentations/Pedersen_LasseJonFuglsang_TemporalReprojectionAntiAliasing.pdf

    目前看来TAA效果还可以,但是存在的问题不太好处理,也不支持VR。

    MSAA对于deferred管线来说来浪费显存和带宽。

    另外也看了UE4的AGAA的ppt,虽然效果不错,但是对渲染管线的侵入和改动太大

  • 相关阅读:
    mysql 优化总结
    mac、linux 查看端口占用程序
    mysql 优化之查询缓存(mysql8已经废弃这个功能)
    laravel 中的 toSql 获取带参数的 sql 语句
    mysql 统计 group by 之后的 group 的个数
    shell 循环语句
    shell 中的流程控制关键字
    为什么要用babel-polyfill
    gulp --watch直接退出,并没有监听
    nodejs安装使用express
  • 原文地址:https://www.cnblogs.com/crazii/p/7244300.html
Copyright © 2011-2022 走看看