[工作积累] 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,虽然效果不错,但是对渲染管线的侵入和改动太大

时间: 2024-12-19 16:28:32

[工作积累] TAA Ghosting 的相关问题的相关文章

工作积累之NDK编译STL (zhuan)

方法: 1.在jni目录下新建Application.mk; 加入 APP_STL :=  stlport_static  右边的值还可以换成下面几个: system - 使用默认最小的C++运行库,这样生成的应用体积小,内存占用小,但部分功能将无法支持 stlport_static - 使用STLport作为静态库,这项是Android开发网极力推荐的 stlport_shared - STLport 作为动态库,这个可能产生兼容性和部分低版本的Android固件,目前不推荐使用. gnust

[工作积累] Google/Amazon平台的各种坑

所谓坑, 就是文档中没有标明的特别需要处理的细节, 工作中会被无故的卡住各种令人恼火的问题. 包括系统级的bug和没有文档化的限制. 继Android的各种坑后, 现在做Amazon平台, 遇到的坑很多, 这里记录一下备忘: 先汇总下Android Native下的各种问题, 当然有些限制有明确文档说明,不算坑,但是限制太多还是很不爽: android平台下的某些限制: android下的各种坑 (我的C/C++/汇编/计算机原理博客) OBB的各种bug: OBB的解决方案 arm gcc t

工作积累(五)——使用[email protected]注解实现常量功能

之前的博客中提到过如何通过 java.util.ResourceBundle 和 java.util.Properties类通过读取 key-value 文件的形式实现常量功能.其实 spring 已经通过@Value 注解实现,下面看看如何使用. 1.创建.properties文件: 在如下目录创建 keyvalue.properties文件src/main/resources/META-INF/spring/keyvalue.properties ,写入如下内容: test.value=il

[工作积累] NDK通过Java获取package name 和version

////////////////////////////////////////////////////////////////////////// //Java code snippet //get APK's versionCode in AndroidManifest.xml public int getVersionCode() { int versionCode = 1; try{ PackageInfo packageInfo = this.getPackageManager().g

HAL层Camera模块Dump图片--工作积累

导出YUN数据进行调试,分析问题: 1 // dump图像数据 事列 2 void dump(const int width, const int height, void *yBuf, void *uvBuf) 3 { 4 char buf[256] = {'\0'}; 5 FILE* file_fd = fopen(buf, "wb"); 6 snprintf(buf, sizeof(buf), "/data/Effect/%dx%dvideodenoiser%d.yuv

[工作积累] UE4 TAA ReProjection的精度处理

先贴一个UE4 TAA的slidehttps://de45xmedrsdbp.cloudfront.net/Resources/files/TemporalAA_small-59732822.pdf 里面细节问题很多,先记录一下目前想到和遇到的问题,便于备忘,后面有空的话再记录. TAA用到的Velocity和抖动对精度要求比较高, 特别是大场景下误差容易比较大,UE4做了一系列的处理来保持精度. 投影矩阵的精度 1 static const FMatrix InvertProjectionMa

工作积累(十)——maven排除相关jar包依赖

在 maven 工程中引用到了一个 jar 包 commons-io-2.4.jar,由于被引用的 jar 包依赖 hibernate-jpa-2.0-api ,而 hibernate-jpa-2.0-api 存在 bug ,会报出 Error: java.lang.NoSuchMethodError:javax.persistence.JoinColumn.foreignKey()Ljavax/persistence/ForeignKey; 或 java.lang.NoSuchMethodEr

[工作积累] shadow map问题汇总

1.基本问题和相关 Common Techniques to Improve Shadow Depth Maps: https://msdn.microsoft.com/en-us/library/windows/desktop/ee416324(v=vs.85).aspx Cascaded Shadow Maps https://msdn.microsoft.com/en-us/library/windows/desktop/ee416307(v=vs.85).aspx Soft shadow

[工作积累] UE4 并行渲染的同步 - Sync between FParallelCommandListSet & FRHICommandListImmediate calls

UE4 的渲染分为两个模式1.编辑器是同步绘制的 2.游戏里是FParallelCommandListSet并行派发的. mesh渲染也分两类,static mesh 使用TStaticMeshDrawList 来绘制, skinned mesh是用DrawingPolicyFactory::DrawDynamicMesh来画.这两类绘制不管是异步还是同步都会调用.具体可以参考DepthRendering.cpp 实际上,有在DX12/Vulkan/Metal 这些支持paralle commi