UE4新书推荐:《大象无形:虚幻引擎程序设计浅析》

今天给大家推荐一本Unreal Engine 4的新书:《大象无形:虚幻引擎程序设计浅析》。

这本书主要是从编程的角度讨论虚幻引擎的使用,分为三个部分,其中第一部分讲用ue4的C++做游戏,第二部分讲ue4本身的一些核心机制(底层、反射、渲染系统、蓝图虚拟机)的源码实现,第三部分讲解插件开发和扩展虚幻引擎的一些方法。我们QQ群内的很多朋友都阅读过该书的样本,从我的角度,我觉得两位作者还是很用心的,没有去大段引述官方文档之类的,而是从自己理解的角度去系统地描述了虚幻引擎关于编程方面的基础知识及其关键点,是一本很好的基础读物,还是值得一阅的。

本书目前开始接受预定,预计5月可以发货,请感兴趣的朋友多多支持。

预定地址:http://product.china-pub.com/5591590

发表在 Book, Unreal Engine 4 | 留下评论

THEGIBOOK在摩点网发起众筹

《全局光照技术:从离线到实时渲染》于2017年3月21日开始在摩点网发起众筹,在这次众筹期间读者可以购买前半本书(约400页)的纸质书稿,以及作者在准备期间总结的一本约300页的包含全书内容的英文草稿,参与众筹的每位读者将额外赠送新书折扣卷,它可以用于新书正式出版后早于任何渠道以7折购买成书。

本次众筹的目的是为了扩大试读范围,以使能够在写作阶段获取更多的反馈来帮助提高最终成书的质量。这次众筹参与者将能得到:

  • A. 列入本站专门的众筹感谢名单页面
  • B. 本书1-6章约400页的纸质书稿
  • C. 本书写作期间总结的关于书中所有全局光照技术的约300页的英文草稿书一本
  • D. 一张7折优惠券用于发布时早于任何渠道在本站以7折购书

多谢大家的支持!
众筹项目地址:http://t.cn/RiBogFq
众筹结束时间:2017年5月1日

发表在 Book | 留下评论

关于离线渲染有哪些资料可以推荐的?

这是回答知乎上的一个问题,贴在这里做个记录。

关于离线渲染最近最全面的Survey可能是Per H. Christensen和Wojciech Jarosz 2016年的:https://www.cs.dartmouth.edu/~wjarosz/publications/christensen16path.html

我针对其中的一些重要内容做点说明,同时考虑到这篇Survey是偏工业运用的,我再补充一点处于研究性质的一些热点新技术。由于这方面资料几乎都是论文为主,我说些相应概念和技术名称,可以对照阅读相关主题的论文。分两个部分:

首先,工业运用中的主流技术,这方面包括Pixar的RenderMan,Disney的Hyperion以及Weta的Manuka等渲染器,主流当然还是CPU渲染,几个比较突出的技术包括:

  • VCM/UPS:由于BPT的缺点是不能处理SDS(specular-diffuse-specular)路径,PM的缺点是处理diffuse表面不如BPT,2012年的VCM/UPS(Vertex connection merging/Unified path sampling)算法是一个很大的突破,它开始尝试将BPT和PM结合起来,使用PM对light subpath采样,并且将算法统一到BPT中,这样BPT就可以有效处理SDS。近几年中VCM/UPS几乎成了现在主流的离线渲染解决方案(参见The Path to Path-Traced Movies这篇论文);当然,VCM/UPS的缺点是,因为它仍然是BPT的思路,eye subpath并不知道light subpath的情况,所以尽管它能处理SDS,但是两个subpath连接的时候形成的很多full path由于可见性(尤其对于复杂visibility的场景)而对光照贡献率很低,而MLT则很擅长处理Visibility的问题,所以Robust Light Transport Simulation via Metropolized Bidirectional Estimators这篇论文就基于VCM/UPS来使用MLT对light subpath进行采样,这样保证了两个subpath之间的连接更符合最终图像分布。这篇论文也就同时把BPT,PM和MLT三大基础算法组合在了一起! 不过目前MLT方法在工业中运用还不多。
  • 光线排序和连贯性:由于光线传输的随意性使得其并不能利用硬件的指令执行模型以及缓存系统,所以考虑光线的连贯性或者对光线进行排序是能够大大提升路径追踪效率的方法,这方面,基于连贯性(coherence)的路径追踪技术将这些数据分组成一些小的数据包,称为光线包(ray packet),这些数据包包含多个内存相邻的数据,并能能够被同一个指令执行。传统的基于光线包的技术主要是针对主要光线(Primary rays),即摄像机向场景发射出的光线,之后的光线可能向场景随处发射,并且对性能影响更大。2013年,迪斯尼的Christian Eisenacher等在一篇名为《sorted deferred shading for production path tracing》的论文中提出了一种改进方法,这种方法的核心思想是在实际计算之前对光线进行排序,这是Disney的In-house渲染器Hyperion的重要组成部分,这些技术最早用于《超能陆战队》当中。
  • 降噪技术:由于蒙特卡洛方法带来的方差,使得需要增加4倍的采样数量才能换来2倍的方差减少,所以每像素采样数是制约路径渲染器性能的重要因素。然而,光增加采样数量并不能有效的解决噪点问题,因为图像的噪点分部通常是不均匀的,所以我们非常渴望能够在方差更大的区域放置更多的采样,这样能够更有效的减少方差,从而在少量的spp条件下获得非常高的图像质量。降噪技术是目前工业当中非常重要的部分,《疯狂动物城》《海底总动员2》这些没有一部不是严重依赖于降噪技术。降噪技术的核心是适应性采样和适应性重建,这些技术将采样的过程分成过个迭代的过程,每次对采样结果进行误差分析,根据误差分布来得出一个采样分布图,用于在下一迭代中在方差更大的地方放置更多的采样。降噪技术主要有两大类方法:基于路径空间的方法,这类方法直接对路径采样的过程进行跟踪,比如使用频率域分析或者微分分析等,由于计算量比较大,工业中主要使用第二种基于图像空间的方法,这方面的核心人物是Fabrice Rousselle。

其次,处于研究中的一些热点技术:传统的蒙特卡洛方法中每个抽样之间是独立的,它并不能有效辨识这种频率变化特征,要想能够辨识图像的分布特征,我们需要了解每个路径的局部特征,即我们要考虑光线之间的相关性,这可以从多个层面改善路径追踪算法的效率。以下举几种热点技术:

  • 频率域分析:这类技术在光线追踪的过程中,还同时跟踪一条该光线(称为中心光线)对应的一个局部光照场(Local Light Field),这其实是一个像素范围内的空间-方法-时间(spatial-direction-temporal)分布,这个分布会随着光线的传输过程变化,例如表面的BRDF反射,直线传播,阴影遮挡等,如果能够跟踪这个分布的变化,就能够有效地分析图像的一些局部特征。这可以用来实现纹理过滤,适应性采样和适应性重建等很多有用的运用。频率域分析当前比较高效的实现是协方差追踪,它用一个椭圆形的高斯分布来进行这个局部光照场的分布,而这个椭圆形高斯分布可以用该局部光照场的协方差矩阵来表示,这方面的核心人物是Frédo Durand和Laurent Belcour等。
  • 流形/微分几何:流形探索技术的思路是利用费马原理能够非常有效地寻找光泽路径,它主要用于MLT中用于寻找镜面,光泽路径,但是它不能成为一种独立采样算法,因为流形探索依赖于一条已有路径;另外,流形探索在Weta还被用于在漫反射顶点处计算透过光泽的半透明体直达光源的“直接光源”计算,因此渲染焦散效果,层表面散射非常有效。这方面的核心人物是PBRT的作者之一Wenzel Jakob等。
  • 梯度域渲染:梯度域渲染技术也是与具体采样算法相对独立,可以是传统的PT,BPT或MLT,它通过在已有路径上计算梯度来提供图像的高频部分信息,最后通过泊松方程重建图像,传统的蒙特卡洛算法善于对低频部分进行采样,而筛选泊松方程的实质是梯度场充当了高频区域的采样,所以同样同等采样算法和采样数下渲染质量高得多。

以上只是些相对重要和热门的技术,当然不是全部,这些内容都会在THEGIBOOK 中探讨。

发表在 Survey | 标签为 , , , , , , | 留下评论

感谢Epic Games授权将《A Boy and His Kite》动画短片画面用作THEGIBOOK封面图片!

亲爱的读者朋友们:

我们很高兴地向您宣布:Epic Games已经正式授权将《A Boy and His Kite》动画短片中的画面用作《全局光照技术:从离线到实时渲染》的封面图片!

《A Boy and His Kite》是一部使用Unreal Engine 4制作的实时动画短片,它凭借Unreal Engine 4优秀的渲染技术获得SIGGRAPH 2015 最佳实时图形与交互奖项(BEST REAL-TIME GRAPHICS AND INTERACTIVITY AWARD),如果您还没有欣赏过这部短片,可以从这里获得更多相关信息。

本书选择这张图片作为封面有两个原因:其一是它反映当代优秀的实时图形渲染技术;其二,更主要的是我想透过这张图片传递一个寓意。这个短片展示了一个小男孩非常喜欢他的风筝,在大自然中自由地追随它,在一个无限的世界里畅游。与此相似,在这本书中除了知识以外,我也想传递一种对知识的追求精神,现在很多人看书存在很大功利心理,只求会用,不求理解,因为真正理解一种技术是需要花费很多时间成本,然而没有这种精神,本书就不会呈现出那么多丰富而细致的内容,我希望读者能够从文字中感受到这种精神:我们必须真正喜欢和热爱技术,然后才能真正享受它带来的乐趣;同时我也希望这本书像一片宽阔的草原,读者可以在上面尽情自由地学习,畅游,能够发现和得到足够多这些知识带来的乐趣。

以下是本书的一个封面草图,它不一定是最终版本,但是封面图片是确定的,您也可以帮助我们设计封面,如果您的设计最终被采纳,我将赠送一本签名成书,以及在封面加上您的创作署名,感兴趣的朋友欢迎和我联系。

除此之外,本书作为一本聚焦于全局光照算法的书籍,虽然不会重点围绕一个渲染引擎或者一个渲染引擎相关的特性来展开讨论,但是例如像Unreal Engine 4这样的渲染引擎所具有的大部分渲染特性都会出现在本书的各个部分中。特别地,本书在讨论相关内容时,几乎都是优先使用Unreal Engine 4来进行描述和演示,本书会覆盖Unreal Engine 4的绝大部分渲染相关的内容,希望能够帮助读者更好地掌握和使用Unreal Engine 4游戏引擎。

发表在 Book | 7条评论

聊聊最近几年的路径追踪技术的进展(一)

(注:本文是对《全局光照技术:从离线到实时渲染》一书中路径追踪技术相关内容的一些高度概括和总结,本文仅讨论概念和思路,详细的内容请参考原书相关章节内容,转载请注明源自:http://www.thegibook.com)

路径追踪技术(Path tracing,PT)已经是当下工业中离线渲染使用的主流技术,不管是商业渲染器如皮克斯的RenderMan,Solid Angle的Arnold等,还是迪士尼的in-house渲染器Hyperion以及Weta Digital的Manuka都是基于路径追踪技术。路径追踪算法非常简单,它首先将光照方程表述为面积积分的形式,然后一束光线从光源经过各个物体表面及内部多次交互(反射,折射,散射)后进入图像平面的贡献值(即辐射照度)被转换为这些表面交互点形成的路径的一个积分,其被积函数为这些表面的双向散射系数(BSDF),顶点之间的积分变量变化(change of variables)以及顶点之间可见性的乘积。在统计中,积分可以很简单地使用蒙特卡洛方法进行估计,因此光照传输的问题就转化为对场景进行路径采样,然后对每条路径的贡献值进行平均求和的蒙特卡洛积分计算。

尽管自基本的路径追踪算法被提出以来,各种增强改进的方法被整合进来,然而上述路径追踪技术的“基础架构”几乎没有多少实质性的变化。对于任何行业,工业中主流的技术一般不是当下最先进的技术,而是最成熟可工业化的方案,当前工业中的路径追踪技术优化主要集中在优化算法的执行效率,主要是针对处理器硬件架构进行优化,例如针对缓存系统的优化,增强数据局部性和指令局部性,以及改进光线连贯性(ray coherence)使其能够利用SIMD指令进行高效计算等,这方面比较突出的是迪士尼的Hyperion渲染器,一些渲染器的优化更是几乎能达到某些场景复杂度范围内实时渲染,例如Embree。

然而以上这些内容却不是本文关注的重点(上述内容会在thegibook中详细讨论),本文我们要讨论的是一些路径追踪算法基础架构层面的改进,这些算法还很少出现在当前工业解决方案中,但是确实未来的重要发展趋势。

传统的路径追踪算法是一个单纯的积分问题,因此可以使用蒙特卡洛方法来估计,然而蒙特卡洛方法的每个抽样是独立的,因此很难有效快速对一些比较困难的路径进行采样,一些很难被采样的路径需要巨量的采样数才能达到“令人满意”的结果,这导致非常缓慢的收敛速度。尽管开始的收敛速度非常快(4倍采样数量可以减少1/2的误差),但是越到后面会花费更多倍的时间。传统的方差缩减技术如重要性采样,分层采样,拟蒙特卡洛方法(Quasi-Monte Carlo)仍然不能改变这个收敛速度。

要提升蒙特卡洛估计的收敛速度,直观上,我们需要能够辨识每个图像的分布特征,然后在一些高频变化区域增加采样的密度。然而,传统的蒙特卡洛方法中每个抽样之间是独立的,它并不能有效辨识这种频率变化特征,尽管梅特波利斯光照传输(Metropolis light transport,MLT)通过采样点之间的相关性能够寻找一些困难路径,本质上它仍然并不善于处理和分析频率域特征。要想能够辨识图像的分布特征,我们需要了解每个路径的局部特征,即是我们需要对路径追踪算法引入微分运算。路径的微分涉及路径与附近局部范围内光线的差值,即图像的局部特征,因此它引入了光线之间的相关性,可以从多个层面改善路径追踪算法的效率(也正是如此,我们认为这是近几年路径追踪技术领域的重大进展)。

最近几年路径追踪领域的一些重大进展正是微分几何(differential geometry)的引入,由于微分反应的是流形(manifold)的局部变化,因此非常善于寻找图像分布中的高频部分,目前路径追踪算法中的微分运用主要包括:以通过计算纹理过滤函数实现反走样的光线/路径微分(ray/path differential)和协方差追踪技术(covariance tracing);以通过计算梯度图像用于利用筛选泊松方程(Screened Poisson equation)重建目标图像的梯度域渲染(gradient-domain rendering);以及通过将微分几何结合费马定理(Fermat principle)用来寻找镜面/光泽路径的流形探索(manifold exploration),半矢量空间光照传输(half vector space light transport)等技术;此外,微分还被用于适配性采样(adaptive sampling),成为重要的降噪技术(Denoising)。

以下我们就来从概念和思路上分析上述这些技术,当然我们可以提前知道的这些技术的一个重要共同点就是:这些微分计算通常不需要通过光线追踪引入新的采样点,否则那样的计算成本就很高,这些技术通常都是利用微分几何和某些假设进行单纯的微分计算,这里主要的工具是一阶泰勒展开式(first-order Taylor approximation)和顶点处的切线平面空间(tangent space),因此,这些新技术通常都可以很容易地集成于目前主流的路径追踪技术基础架构之上,更详细的内容请参考thegibook中相关章节。

接下来我们讨论的每一种微分的运用都涉及一个相对比较独立的层面,在阅读这些内容的时候,你首先需要非常清晰的了解的是它用来解决什么问题,因此我会在每一节的开头提出这个问题,然后读者可以围绕这个问题来阅读每一小节,即每一种技术。

光照传输的局部频率域分析

微分反应的是图像的局部特征,因此其在图像渲染中最直观的运用就是用于反走样(anti-aliasing)。光线追踪算法中由于采用不足导致的走样问题可以分为两大类:对路径空间(path space)的采样不足和对纹理空间(texture space)的采样不足,本质上这都是由于路径采样的不足导致的,但是它们通常使用不同的方法来解决。一个像素区域内的光线从屏幕空间发射出去之后,随着光线在表面的各种交互这个面积可能会无限扩散,所以单纯增加路径采样的数量可能也很难弥补纹理走样(texture aliasing)的问题。所以它们分别对应路径追踪算法中两个比较独立的反走样技术:路径空间采样不足主要对应于降噪技术,纹理空间采样不足对应于纹理过滤技术。

目前降噪技术主要的思路是针对图像的分布特征进行适配性采样以及适配性重建,前者对应于在图像的高频区域放置更高的路径采样密度;后者对应于根据图像特征对不同的区域使用不同的重建过滤器(reconstruction filter)。对路径进行适配性采样的方法可以分为两类:第一种直接对光照传输方程进行分析,称为先验方法(a priori method);而第二种只对屏幕空间的图像进行分析,称为后验方法(a posteriori method)即是说与路径采样的方法无关。

光照传输的局部频率域分析可以用于纹理过滤以及作为降噪技术中的先验方法。以下我们讨论局部频率域分析的方法和思路。

路径的局部频率域分析虽然不是源自光线微分(ray differential)技术,但是跟它有很大的联系。光线微分技术的核心思路是随着光线的传播跟踪该光线对应的频率区域一个像素的大小,这称为光线的足迹(footprint),如下图所示,在路径追踪算法中追踪每条路径的时候,同时沿屏幕空间x和y方向分别发射一条一个像素大小的偏移路径,然后对每条基础路径同时跟踪两条偏移路径。路径在每个顶点处的足迹大小则可以通过积分计算出来。当然光线微分技术并没有完全利用微分几何的知识,因为它假设偏移路径和基础路径在每个路径顶点处位于同于平面-即该顶点的正切平面(tangent space)上,所以光线微分的计算大大简化了。

由于假设偏移路径和基础路径和表面的交点位于同一平面,上述光线微分技术仅适用于镜面表面(specular surface),路径微分(path differential)在此基础上将光线微分扩展到了光泽面(glossy surface)和漫反射表面(diffuse surface),它虽然有比较理论的推导,但是实践上主要使用经验方法,即根据表面的粗糙度用来缩放足迹的大小以支持光泽面和漫反射表面。

上述的光线/路径微分技术实际上是光线的一种局部特征,传统的路径追踪算法中每条光线之间的独立的,所以不能够分辨这种局部特征。然而上述方法还是有很多缺点,例如光线经过多次传播之后可能形状非常不规则,而两条偏移路径计算的四边形无法表达这种形状;其次偏移路径可能被阻挡,而光线/路径微分是忽略这种阻挡的;为了更好的追踪光线的局部特征,我们需要更完整的对光线的传输过程进行分析。

目前对光线进行局部分析的方法的思路主要是将光线的局部特征表示为一个空间-方向分布(spatial-angular distribution)的局部光照场(local light field),如下图所示,黄色的中心光线表示基础光线,周围的一些具有不同位置和方法分布的光线是一些虚拟光线,它们共同构成一个局部的空间-方向分布。例如对于摄像机光线,它的局部光照场的分布就是一个像素范围大小的一个过滤器,该过滤器对于每个不同方向和位置处的光线都具有一个不同的权重值,这个过滤器就反映了摄像机路径的局部特征;对于光源路径,如果是面积光,则局部光照场的方向为固定值,而位置分布于面积光源的各个位置。

有了局部光照场的描述,剩下的事情就是计算该光照场随着中心光线的传输。早期的思路是将光线在传输过程中的各种交互过程看做一个操作函数,例如光线的直线传输(transfer),反射,折射,阴影遮挡等,如下图所示,然后在局部光照场函数的频率空间进行交互,这样就可以跟踪局部光照场随中心光线的传播过程。

上述的傅里叶分析过程计算成本相对较高,为了简化局部光照场的传输,协方差追踪(covariance tracing)技术考虑可以将一个4D的空间-方向分布近似为一个椭圆形高斯分布(elliptical Gaussian filter),如下图所示,然后该分布可以使用该4D光照场的协方差来表示,所以局部光照场可以用其协方差矩阵(covariance matrix)来表示。然后这些对局部光照场的传播操作数就转变为矩阵操作,最后在计算足迹的时候再从协方差计算出该4D局部光照场的尺寸,这就可以用来替代上述的光线/路径微分技术用来实现纹理过滤。

协方差追踪不仅用于纹理过滤中计算局部光照场足迹的大小,还被用于适配性采样,如果我们从光源路径方向追踪光源的空间-方向分布至屏幕空间,则我们可以在屏幕空间分析图像的频率分布,进而可以用于适配性采样,如下图所示。下图的局部光照场是一个5D空间,它还包含了时间维度,因此可以用于计算运动模糊(motion blur)效果,在该图中,首先从光源发出光线经过一次表面交互(即直接光)之后投射一个椭圆形分布到屏幕空间,然后根据这些分布就可以计算出图像的频率分布,这些分布特征被用于适配性采样。

除了协方差追踪,光照传输的局部频率域分析还包括其他一些方法,但是目前协方差追踪是更简单和高效的一种技术。当然协方差追踪的限制是它将局部光照场近似为一个椭圆形的分布,实际的局部光照场分布特征可能还需要更负责的形状表述,这也是未来的优化方向。

下一篇我们将讨论梯度域渲染和流形探索或者半矢量空间光照传输。

发表在 Global Illumination, Ray Tracing, Survey | 标签为 , , , , , , | 留下评论

Robust Light Transport Simulation via Metropolized Bidirectional Estimators

今年SIGGRAPH Asia上最感兴趣的莫过于这篇Robust Light Transport Simulation via Metropolized Bidirectional Estimators,看标题就很牛逼:原本比较独立的光线追踪两大经典算法BPT和MLT合体了!这里简要描述下这篇论文的思路:

传统上我们认为光线追踪有三大基础算法:BPT,PM和MLT,它们都是相对比较独立的,因为它们各自采用不同形式的光照公式,例如BPT的路径积分形式,PM的范围估计,MLT则是将整个图像看成一个分布,这些看起来都是完全独立的。然而它们各自都有优缺点,好的想法是能不能把它们组合起来。

例如BPT的缺点是不能处理SDS,PM的缺点是处理diffuse表面不如BPT,MLT由于抽样点的相关性导致处理高光表面很低效,因为Markov chain始终在高频尖锐的部分徘徊,从整个图像上看stratification不够好;

2012年的VCM/UPS算法是一个很大的突破,它开始尝试将BPT和PM结合起来,使用PM对light subpath采样,并且将算法统一到BPT中,这样BPT就可以有效处理SDS。近几年中VCM/UPS几乎成了现在主流的离线渲染解决方案(参见The Path to Path-Traced Movies这篇论文);

然而VCM/UPS的缺点是,因为它仍然是BPT的思路,eye subpath并不知道light subpath的情况,所以尽管它能处理SDS,但是两个subpath连接的时候形成的很多full path由于可见性(尤其对于复杂visibility的场景)而对光照贡献率很低,而MLT则很擅长处理Visibility的问题,所以这篇论文就基于VCM/UPS来使用MLT对light subpath进行采样,这样保证了两个subpath之间的连接更符合最终图像分布。这篇论文也就同时把BPT,PM和MLT三大基础算法组合在了一起!

具体做法就是,首先使用传统MC在图像平面生成eye subpaths,这里不使用MCMC产生eye subpath的原因是MLT在图像平面(image plane)的stratification不好;然后从这些eye subpath的位置开始产生Markov chain来产生light subpath(所以MLT在这里是用来产生一个subpath分布而不是整个图像分布)。这样整个算法能处理高光和复杂Visibility这两大难题的场景。

论文下载:http://www.ci.i.u-tokyo.ac.jp/~hachisuka/

发表在 Photon Mapping, Ray Tracing | 标签为 , , , , , | 留下评论

6. 光线追踪技术(进行中)

Ray tracing
Path tracing
MLT
Quasi-MC
Real-time/GPU Path tracing
Ray tracing hardware
VCM/UPS

发表在 章节介绍 | 留下评论

5. 蒙特卡洛方法(已完成)

发表在 章节介绍 | 留下评论

书名更名

本书书名由”游戏引擎全局光照技术”调整为:

中文名称: 全局光照技术: 从离线到实时渲染
英文名称: Global Illumination: From Offline to Real-time Rendering

发表在 Uncategorized | 留下评论

为什么VR偏爱Forward Shading?

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

blogassets-2016-november2016-nov15_4_14_releasenotes-414release_banner-770x250-09e89b17f26d1d81a9b75ede4ddc698cb8dd1cfe

“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

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

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

untitled-2

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

untitled

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

ghosting-2

关于重影及模糊相关的问题及弱化方案,请参考《游戏引擎全局光照技术》第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-1

然而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的模糊问题的原因及问题展开相关的分析讨论,关于本篇的全部详细内容都可以在《游戏引擎全局光照技术》试读章节中找到。

发表在 Unreal Engine 4 | 标签为 , , , | 留下评论