[工作积累] 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好。
目前看来TAA效果还可以,但是存在的问题不太好处理,也不支持VR。
MSAA对于deferred管线来说来浪费显存和带宽。
另外也看了UE4的AGAA的ppt,虽然效果不错,但是对渲染管线的侵入和改动太大
[工作积累] TAA Ghosting 的相关问题的更多相关文章
- [工作积累] UE4 TAA ReProjection的精度处理
先贴一个UE4 TAA的slidehttps://de45xmedrsdbp.cloudfront.net/Resources/files/TemporalAA_small-59732822.pdf ...
- TFS工作项数据统计及相关数据库结构分析
今天为客户的质量管理部门人员提供TFS咨询过程中,客户的质量管理专家基于TFS提出了一个比较棘手的数据统计需求.需求是这样,客户的数十个软件项目通过质量管理部按照年度版本计划进行软件产品系统的发布,因 ...
- [工作积累] Google/Amazon平台的各种坑
所谓坑, 就是文档中没有标明的特别需要处理的细节, 工作中会被无故的卡住各种令人恼火的问题. 包括系统级的bug和没有文档化的限制. 继Android的各种坑后, 现在做Amazon平台, 遇到的坑很 ...
- [工作积累] shadow map问题汇总
1.基本问题和相关 Common Techniques to Improve Shadow Depth Maps: https://msdn.microsoft.com/en-us/library/w ...
- [工作积累] 32bit to 64bit: array index underflow
先贴一段C++标准(ISO/IEC 14882:2003): 5.2.1 Subscripting: 1 A postfix expression followed by an expression ...
- [工作积累] bitfield
ISO/IEC 14882:2003: 9.6 Bit-fields [class.bit] A member-declarator of the form identifieropt : const ...
- [工作积累] GCC 4.6 new[] operator内存对齐的BUG
对于用户没有定义dctor(包括其所有成员)的类来说, new CLASS[n] 可能会直接请求sizeof(CLASS)*n的空间. 而带有dctor的 类, 因为delete[]的时候要逐个调用析 ...
- [工作积累] UE4 并行渲染的同步 - Sync between FParallelCommandListSet & FRHICommandListImmediate calls
UE4 的渲染分为两个模式1.编辑器是同步绘制的 2.游戏里是FParallelCommandListSet并行派发的. mesh渲染也分两类,static mesh 使用TStaticMeshDra ...
- [工作积累] D3D10+ 中 Pixel Shader 的input semantic和参数顺序
由于semantic的使用,我们有理由相信 vertex shader的output 和 pixel shader的input是按照semantic来匹配的,而跟传入顺序无关.印象dx9时代是这样. ...
随机推荐
- 记录一次配置golang服务器端口
之前配置程序监听端口,地址都写成IP+:Port的格式,然而一直调试不同,也找不出问题. 后来,参考博客https://blog.csdn.net/yoie01/article/details/214 ...
- EFCore Lazy Loading + Inheritance = 干净的数据表 (一) 【献给处女座的DB First程序猿】
前言 α角 与 β角 关于α角 与 β角的介绍,请见上文 如何用EFCore Lazy Loading实现Entity Split. 本篇会继续有关于β角的彩蛋在等着大家去发掘./斜眼笑 其他 本篇的 ...
- 其他知识点,API
日期和Math 获取2017-06-10格式的日期 Date.now() //当前时间毫秒数 var dt=new Date() dt.getTime() //毫秒数 dt.getFullYear() ...
- unity解压缩zip发布后的一些问题
前段时间项目需要,搞了下zip的解压缩问题,也是利用ICSharpCode.SharpZipLib.dll来处理的zip,这里说下之前遇到的坑(这里提供我用的这个库ICSharpCode.SharpZ ...
- 团队项目需求心得——慢阻肺疾病管理APP
一.项目介绍: 先上图: 这是我们小组开发项目的系统构成图. 本项目研发面向家庭/社区,对稳定期中慢阻肺患者病情和环境全方位监测.简单病情趋势分析和患者行为干预,并且提供患者与家庭医生和专家沟通渠道的 ...
- docker学习---第一章节
一.docker的应用场景有哪些 Web 应用的自动化打包和发布 自动化测试和持续集成.发布 在服务型环境中部署和调整数据库或其他的后台应用 从头编译或者扩展现有的OpenShift或Cloud Fo ...
- Codeforces Round #479 (Div. 3) F. Consecutive Subsequence (简单dp)
题目:https://codeforces.com/problemset/problem/977/F 题意:一个序列,求最长单调递增子序列,但是有一个要求是中间差值都是1 思路:dp,O(n)复杂度, ...
- 《多线程操作之生产者消费者》(单生产单消费&多生产多消费)
说明1:假设有一个放商品的盘子(此盘子只能放下一个商品).生产者每次生产一个商品之后,放到这个盘子里,然后唤醒消费者来消费这个面包.消费者消费完这个商品之后,就唤醒生产者生产下一个商品.前提是,只有盘 ...
- 关于redis的安装
下载redis 我这边下载redis4.0.1版本, 然后解压 然后执行yum -y install gcc gcc-c++ libstdc++-devel 然后cd //qbtapp/redis-4 ...
- 绘客708s的设置
平时也有画画的想法,虽然画的不好,但是装备还是少不了的.因此,在大概一年之前就入手了绘客的708s的绘画板,10寸乘6寸的,很大,手绘方便多了. 在这段时间内,使用绘画板的时候还是遇到了一些问题,最主 ...