刚刚发布的Unreal Engine 4.14中,其第一个重要的特性就是增加了在VR开发中对Forward Shading的支持。我们都知道在很多方面Deferred Shading都优于Forward Shading,它也是时下主流游戏引擎使用的渲染架构,而仅有在移动等设备中由于缺乏MRT的支持时才不得不选择Forward Shading,那么为什么Unreal Engine 4会在VR开发中选择使用Forward Shading?

“The forward renderer supports both multi sample anti-aliasing (MSAA) and temporal anti-aliasing (TAA). In most cases TAA is preferable because it removes both geometric aliasing and specular aliasing. In VR, the constant sub-pixel movement introduced by head tracking introduces unwanted blurriness, making MSAA a better choice.”

这里指出了Deferred Shading的其中一个重要的缺点,那就是不支持MSAA。MSAA一般是由硬件支持的反走样(anti-aliasing,AA)技术,它在光栅化阶段在一个像素区域内对每个像素使用多个深度采样值,但是每个像素内的这些深度采样值共享一个着色计算,即是每个像素仍然只执行一次fragment shader的计算,然后计算的结果被复制到每个子深度采样点上,这样一个像素内深度测试失败的子采样点将不会包含颜色信息,从而能够更使最终的颜色过渡更平滑。MSAA与SSAA的不同就在于MSAA的每个像素只执行一次着色计算,因此比SSAA具有较大的性能优势,但是也因此MSAA不能处理由于着色计算中对函数(如高光)采样不足导致的走样(如Shader Aliasing),但是由于人眼对于几何边缘的敏感度更高于对颜色的敏感度,因此MSAA是一种相当受偏爱的技术。

然而在Deferred Shading中,为了避免无数被深度测试剔除的像素的着色计算,它将着色计算从光照方程中分离出来,并将它延迟到深度测试之后使用单独的通道进行计算,通过深度测试的那些像素的材质参数被写入到G-buffer中,这样Deferred阶段就可以使用G-buffer中的材质数据仅对那些通过深度测试的像素进行计算,从而大大增加渲染性能,这也就是Deferred一词的来历。然而,MSAA被集成于光栅化阶段,也即是生成G-buffer的阶段,MSAA输出的是比屏幕分辨率更高的输出辨率,因此4xMSAA也就意味着4xG-buffer,这大大增加了显存的性能开支,更重要的,由于Deferred阶段读取这些G-buffer数据带来的带宽占用和内存读取延迟。

所以,Deferred Shading更偏爱也是目前主流的反走样技术是TAA,即时间反走样(temporal anti-aliasing),TAA的思路就是每帧还是执行一个正常的对每个像素执行单次采样和单次着色的计算,但是它在每一帧对摄像机的位置在屏幕区域内执行一个在一个像素尺寸内的抖动操作,这样如果将邻近的多个帧的数据混合起来,就相当于对每个像素执行了多次深度采样,如下图所示。TAA相当于SSAA的效果,它将多个采样点从单帧内的空间分布转化到时间上,使得每一帧绘制并不会增加多次采样导致的性能开支,又能达到像SSAA一样的图像品质,因此TAA是时下相当受偏爱的一种在Deferred Shading渲染架构下的反走样技术。

然而TAA技术看似美好,其背后仍然存在很大的问题,这些问题从宏观角度来讲可以分为两类:即模糊(blur)和重影(ghosting),从原理上讲它们其实可以归为一个问题,即ghosting消除到一定程度就是blur,然而由于TAA的天生特性,这种模糊基本上是无法绝对消除的。

为了混合在一个像素内的多个子采样点的结果,TAA需要对一个历史缓冲进行采样,将历史颜色和当前帧计算的结果以一定的比例进行混合,当前帧颜色混合的比例越大,则越快逼近最终结构,但是品质更差,反之逼近过程更慢,但是品质更好。但是对历史颜色的获取不是一个例如从数组中获取某个数据的问题,而是一个对纹理进行采样的问题,因为我们不可能在下一帧得到一个和上一帧完全一模一样的位置,所以只能使用纹理采样技术,而纹理的采样涉及过滤(filtering)的过程,它是对采样位置周围一定范围内的像素的值进行加权混合的结果,所以每次混合计算每个像素融合了周围比如4个像素的颜色结果,而这4个颜色值则混合了来自它们周围4个颜色的混合结果,以此类推,随着时间的推移,TAA中每个像素会包含周围很大范围内的颜色的信息,造成了严重的模糊现象,如下图所示。

这种模糊效果可以通过增加当前帧颜色的混合比例来减少历史颜色的比值而有所缓解,例如下图所示,或者一些引擎使用锐化过滤器(sharpen filter)来提升邻近像素的比重,但由于TAA历史累计以及颜色过滤的特性,本质上这种模糊是不可绝对消除的。

在这个历史混合过程中,如果每个像素上一帧和当前帧没有发生太多变化,例如画面完全是静态的,则这种累计过滤结果仅会导致模糊现象。然而如果屏幕颜色发生了变化,例如物体移动,则当前帧和上一帧的颜色信息发生了完全的变化,如果我们不能够区分一个像素内多个子像素之间的这种绝对变化,而仍然将它们混合,则会产生严重的重影现象,即一些物体内的颜色被混合近另一个物体内,如下图所示。

关于重影及模糊相关的问题及弱化方案,请参考《游戏引擎全局光照技术》第4章的内容,本篇仅简单讨论TAA模糊的问题。这种模糊现象在VR开发中会显得更加严重,因为VR头盔频繁的移动,以及VR相对普通屏幕对清晰度的更高要求都会进一步放大TAA的模糊问题,所以Unreal Engine 4在最新的版本中针对VR使用了Forward Shading。

那有没有什么更好的方案用于在Deferred Shading架构中替代TAA,这里笔者能够想到的就是Nvidia最新的AGAA(Aggregate G-Buffer Anti-Aliasing)技术,Nvidia已经将AGAA技术实现在Unreal Engine 4(还没有在UE4主分支)当中。与TAA的思路不一样,AGAA并不累计历史颜色,因此不存在TAA的历史累计混合问题,AGAA使用MSAA的思路,在同一帧内使用多个子采样点,例如8x,由于这在Deferred Shading会导致8x的G-buffer,所以AGAA是利用pre filtering的思路将这8x的材质参数pre filter成2x(或更多,但通常2个足够)的G-buffer,因此称作为Aggregate G-Buffer,这样8x的深度采样只输出2x的G-buffer,这样就减少了G-buffer的内存占用以及导致的带宽占用性能问题,如下图所示。

然而AGAA对硬件是有要求的,聚集几何缓存数据生成阶段的主要目的是将n个子采样点的数据过滤到c个(c<n)聚集中,这需要用到目标无关光栅化(target independent rasterization)技术,这是NVIDIA的NV_framebuffer_mixed_samples扩展提供的一个功能,它可以对深度测试使用更高的采样率,而对输出颜色目标使用更低的分辨率,在每个片元着色器仅输出到c个颜色目标中的一个,这通过一个目标覆盖的位掩码设置:NV_sample_mask_override_coverage。

AGAA适用于Deferred Shading,同时没有时间累积混合的问题,它可以产生媲美SSAA的品质,因此在当前TAA对VR极度不友好,Forward Shading又由于众所周知的性能问题下,AGAA或许未来会有一定的舞台。

然而AGAA也是有缺点的,它的主要问题是由于Pre filtering要求每个像素内的材质类型必须一致,否则pre filtering的结果必定是错误的,这在当前PBR主流的光照计算中,场景中大部分物体都可以使用统一的一套材质参数表述,因此还是能够适应大部分场景,少部分特殊材质类型可以使用单独的渲染通道来解决。另外,Pre filtering还要求光照方程中能够被Pre filter的参数必须是相互独立的。这两个问题是AGAA今后优化发展的重点方向。

本篇仅就Unreal Engine 4引出的TAA的模糊问题的原因及问题展开相关的分析讨论,关于本篇的全部详细内容都可以在《游戏引擎全局光照技术》试读章节中找到。

VR是TAA的终结者吗?的更多相关文章

  1. IMAX公司CEO:进军VR产业,打造VR体验中心

    591ARVR资讯网www.591arvr.com报道近日,<财富>杂志采访了IMAX首席执行官理查德·葛尔方(Richar Gelfond),后者谈了谈虚拟现实和IMAX正在打造的VR影 ...

  2. [工作积累] TAA Ghosting 的相关问题

    因为TAA要使用上一帧的历史结果,那么在相机移动的时候,颜色就会有残留,出现ghosting(残影). 由于上一帧历史是累积的,是由上一帧的直接渲染结果和上上帧的结果做了合并,所以ghosting并不 ...

  3. VR ( Virtual Reality )、AR(Augmented Reality)、MR(Mix Reality)和CR(Cinematic Reality)是什么鬼?

    整个社会对虚拟现实的研究和开发源于上个世纪六十年代,计算机图形学.人机接口技术.图像处理与模式识别.多传感技术.语音处理与音响技术.高性能计算机系统.人工智能等领域在之后半个世纪取得了长足的发展为虚拟 ...

  4. 2015游戏蛮牛——蛮牛杯第四届开发者大赛 创见VR未来开启报名

    蛮牛杯启动了,大家开始报名! http://cup.manew.com/ 这不是一篇普通的通稿,别着急忽略它.它是一篇可以让你梦想变现的通稿! 从某一天开始,游戏蛮牛就立志要为开发者服务,我们深知这一 ...

  5. VR/AR 非技术总结

    VR/AR 非技术总结 **欢迎转载~转载请注明Erma的博客 http://www.cnblogs.com/Erma-king/** 都说2016是VR/AR的元年,上半年我随着新技术的潮流进入了V ...

  6. BZOJ 1251: 序列终结者 [splay]

    1251: 序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3778  Solved: 1583[Submit][Status][Discu ...

  7. VR、AR、MR的区别

    VR.AR.MR定义: 什么是虚拟现实? 虚拟现实(Virtual Reality,简称VR,又译作灵境.幻真)是近年来出现的高新技术,也称灵境技术或人工环境.虚拟现实是利用电脑模拟产生一个三维空间的 ...

  8. 第八章 交互技术,8.1 VR电商购物(作者:宋五)

    8.1 VR电商购物 前言 GM LAB在2016年3月成立,是一个旨在探索最新电商购物体验的实验室.在探索VR购物的过程中,有两个需要核心解决的问题:一个是VR购物的产品形态是什么,另一个是VR环境 ...

  9. [BZOJ1251]序列终结者

    [BZOJ1251]序列终结者 试题描述 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题 ...

随机推荐

  1. jQuery Mobile + HTML5

    最近项目需要,需要构建一个适合手持设备访问的站点,作者从网上查阅了一些资料,本文就是基于此而来. 首先下载jQuery Mobile http://jquerymobile.com/,选择稳定版即可. ...

  2. Linux基础精华

    Linux基础精华 (继续跟新中...) 常用命令: Linux shell 环境 让你提升命令行效 率的 Bash 快捷键 [完整版] 设置你自己的liux alias Linux的Find使用 L ...

  3. 股市T+0技巧

    虽然现在股票不能t+0交易了,不过通过股票t+0技巧可以变相的实现t+0交易,尤其在主力方面应用股票t+0技巧更为明显.主力资金一旦介入某股,肯定会建立很大的仓位作为主仓,然后长线持有.然而为了推动股 ...

  4. 通过JavaScript脚本实现验证码自动输入

    很多网站在用户进行某次点击,比如在线购物确认购买时,会要求用户输入验证码,这在一般情况下也没啥问题,但在用户需要频繁购买或是抢购时就很讨厌了.其实网站的验证码一般是由JS脚本生成的,因此也可以通过编写 ...

  5. Seo的几个境界

    Seo的境界 第一层,弄些关键词排名上去. 是的,大部分人理解的Seoer,就到此为止 这里有技巧若干若干.很值得一些人去卖弄. 第二层,大量广泛的收录,很好的pr值 恭喜您,把握搜索长尾, 这种不显 ...

  6. MySql的基本操作以及以后开发经常使用的常用指令

    第一章:数据类型和操作数据表MySQL语句的规范(1):关键字与函数名称全部大写(2):数据库名称,表名称,字段名称全部小写(3):SQL语句必须以分号结尾 1:命令行模式启动mysql服务net s ...

  7. Leetcode 160 Intersection of Two Linked Lists 单向链表

    找出链表的交点, 如图所示的c1, 如果没有相交返回null. A:             a1 → a2                               ↘               ...

  8. Help Viewer 2.2 独立运行

    "C:\Program Files (x86)\Microsoft Help Viewer\v2.2\HlpViewer.exe" /catalogName VisualStudi ...

  9. log4qt的使用

    Log4Qt替换成新版本使其支持Qt5:https://github.com/devbean/log4qt/tree/master/src/log4qt 1. 解压log4qt到目标文件夹,如D:\Q ...

  10. Correct use of System.Web.HttpResponse.Redirect

    from:https://blogs.msdn.microsoft.com/tmarq/2009/06/25/correct-use-of-system-web-httpresponse-redire ...