首 页 | 博 客 | 试读下载 | 读者反馈 | 在校学生特惠申请 | QQ群: 308861655

不是吧,实时光线追踪终于实现了?


#1

这几天微软公布DX光线追踪 EA、《量子破碎》厂商演示画质惊人 DX光线追踪(简称DXR)。大家怎么看?
https://www.ithome.com/html/game/351778.htm


#2

很显然这个还是很实验性质的,但是其意义还是很积极的,这里首先谈一下自己理解的意义,然后说说在使用过程中可能会遇到哪些问题,最后说说我们开发者需要为此做什么准备。

首先说说它的意义:
未来的实时渲染无疑肯定会是属于光线追踪的,不管它目前看起来多么遥远,或者你认为要将那么大的计算量带到一帧去计算有多么不可思议。其中的理由主要包含两个方面,一是光线追踪的算法架构很简洁,这个可能比第二个理由更重要,因为随着知识和工程量的暴涨,人类需要对已有的知识和工程方法进行高度抽象,而抽象的思路之一就是使用更简洁的模型,因为太复杂的模型就太容易出错,底层抽象不够稳固,上层就容易垮塌,或者说我们根本就盖不起多高的一座楼,因为它总是在出问题,然后我们总是在改问题;第二个理由当然是它能真正实现几乎所有全局光照效果,而且几乎可以统一在同一个基础框架下,目前Pixar的RenderMan都在致力于将以前需要针对单独的效果使用特定渲染通道的方法逐步转变为一个统一的路径追踪渲染通道,这也是简洁的一种表现。但是有一点需要注意,未来的光线追踪采样方法还存在很大改善空间,所以不是说这个变革完全依赖于硬件,这是两头都需要改进的,很多人认为光线追踪没有什么可以深入挖掘的了,当然这是有点片面的。

但是这个变革的历程是什么,当然我们这里主要指在实时渲染方面的演进,目前看起来还很模糊,一方面是一下子将整个光线追踪算法放到GPU中完全替代光栅化显然是不现实的,一方面是一些开发者例如Unreal Engine 4和Cry Engine在做一些局部的光线追踪来辅助光栅化提供全局光照技术,另一方面行业研究者对于将基于CPU的光线追踪算法GPU化的激情并不高,这主要是由于光线追踪算法很难并行化,并没有像光栅化一样有相对比较统一的算法架构,并且处在不断调整当中,如果我们去拆开各大光线追踪渲染器,可能会发现它们之间的算法架构的差异会非常大。GPU加速本质上是对一个已有算法的并行性提取,而不是发明新的算法,因此如果一个算法架构本身是不稳健的,那么这种提取就会不断修改甚至可能是重新提取,这就是当前很多大厂没有在GPU上发力的主要原因,这也是阻碍实时渲染像光线追踪进化的主要因素。

所以这就是我认为DXR或者类似接口的意义所在,它会推动大家去朝这个方向努力,尽管它目前看起来还很粗略,甚至它的目标在短期内是作为光栅化的一个辅助,例如用来提供AO之类的计算,但是开发者在使用这个初级的接口中就会慢慢去提炼出光线追踪在GPU上的一个更稳健的基础架构,也许5年10年之后GPU上的光追架构会和现在非常不一样,但这是这些开发者去使用和改进才有可能发掘的,如果硬件厂商不带头去推动,这一步就很难走,不去走就永远发现不了路途的风景了,所以我认为这是最大的意义。

前方会有哪些困难:
如原文中介绍,DXR的定位和发展路线还是比较清晰,第一步是作为光栅化的一个辅助,用来实现一些光栅化做不到的事情,或者做起来质量很差的事情;第二步是在大量的使用过程中改进GPU光线追踪算法的基础架构,最后才是替代光栅化。这个过程可能会比较漫长,这取决于工业需求,在国内更取决于开发人员在这方面知识中的平均水平和能力。

以下说说光线追踪GPU化过程中会遇到的一些困难吧:

  • 3D体素结构:首先这里的体素并不一定代表是一个3D的空间格子,也可能是3D空间中的一个点,看你需要存储什么信息,这是一般讨论3D体素时需要区分的。首先统一的体素结构会很难,这不像光栅化中的情形,大部分都统一成三角网格+纹理贴图。这主要是因为3D纹理的存储占用极高,因此人们一定会想各种办法去减少存储占用,这就会导致形形色色的表述结构,例如可能使用阶层式(hierarchical)的结构,也有可能分阶的结构(cascaded),也有可能VXGI那种Octree+Bricks的联合结构等等。有时候可能根据需求甚至使用不同类型的结构,例如是隐式结构还是显式结构,比如UE4的距离场是一种隐式结构,他告诉你距离为0的时候就是表面,并不是明确的给出表面点的位置,因此追踪到距离为0时你还需要常规的光线追踪去获取表面信息,因为隐式结构通常不包含表面信息,它们只是用来加速光线追踪的计算,不同于显式结构直接表述表面点,因此光线追踪相交计算很困难,但是隐式结构如距离场通常能快速执行相交计算,除了距离场,隐式表述还有很多种。除了基本结构的选型,其次要考虑怎么对这种3D体素结构执行过滤,这是需要重点考虑的,例如阶层式的结构就不容易实现过滤,因为阶层有可能导致某些空白空间被忽略,注意这里阶层不仅仅是包含类似mipmap那种基于过滤的阶层,这样每个级别的分辨率相同,空间连续,阶层也有可能是类似八叉树这种,有些层级的深度很浅,这就导致每一层级空间不连续,根本无法执行过滤,所以VXGI才采用一种联合结构。其次要考虑体素存储什么数据,单纯材质数据(像2D中的纹理一样),还是会有一些预计算的数据(例如预过滤),渲染方程的线性关系怎样提取,因为线性关系决定了存储那些数据才可能被直接执行过滤操作。最后就是内存访问,3D体素结构往往需要大量的随机遍历操作,怎样保证内存访问的高效,比如能做到像光栅化中的shader访问内存那样具有连贯性,否则的话怎样避免不连贯内存访问导致的延迟,节点的访问需要互斥锁吗,需要手动实现针对特定数据遍历算法的内存管理吗,比如VXGI就是这样,还是依赖于多次渲染通道,将等待的操作放入下次通道并以此迭代直到队列情况,还是GPU硬件可以做改进提供一些新的特性等等。
  • 并行性提取:光线追踪中除了初级光线(primary rays)以外基本上都是不连贯的,后面的迭代更是往随机方向发射,这种并行性提取非常困难,并没有比较标准的模型,Disney的Sorted Deferred Shading看起来是比较高效的,它在每一次光线的递归中都对碰撞点(即材质ID),光线方向进行排序,但是这也不代表行业标准,其它还有很多种方案,例如基于光线包(packets)等。还有虽然排序解决了光线追踪的内存访问效率,但是它们也容易对光线追踪算法的基础架构造成影响,例如Hyperion的光线排序虽然很厉害,但是它基本上只适用于单向路径追踪算法,而不能使用更高效的双向路径追踪算法以及其它更高级的如梅特波利斯算法,光子映射等,当然它们总是可以对渲染器进行修改以适应新的算法,但问题是这种改动量往往是非常大的,每次添加一个新功能都需要修改很多地方,甚至对美术制作流程做出影响。而且,由于并行性是对算法结构中可并行能力的提取,如果算法结构本身在持续修改中,那么并行性提取就会花费很多时间。

以上随便说点想到的,虽然很多问题,但是就像前面说了,如果没有一个因素去推动,那么这些问题就永远不会有统一的解决方案。目前这种基于加速结构+光线分发+光线追踪shader这样的结构还非常粗略,在这个粗略框架下,开发者要做很多事情,只有比较有经验的开发者才能够真正掌控,这些知识要比光栅化方面的要复杂得多。

所以,在光线追踪实时化方面,我们只能寄希望于一种迭代式的演进,比如首先只是用来解决部分问题,例如阴影计算,这样不用立刻考虑那么多复杂因素,渲染器还是以光栅化为主,在此同时去摸索和总结光线追踪实时化(或者说更重要的是GPU化)有哪些特有的特性,慢慢形成比较稳固的架构。

也许多年以后我们会发现GPU中实时游戏使用的光线追踪管线会跟现在的CPU中的光线追踪有比较大的差异,也许我们也可能发现整个GPU中针对光线追踪的管线与目前的光栅化管线有很大的差异,或者说GPU的内存模型还会针对光线追踪在硬件架构层面作出调整,这些都是需要探索的。

针对未来,我们开发者需要做的,学好光线追踪的知识,这样不仅会使我们对整个渲染的概念更加清晰,也是未来必须掌握的技能。

《全局光照技术》耗时三年创作,是一本同时包含离线(其中光线追踪的内容将近300页的篇幅)和实时渲染的图书,并且将两者置于同等重要的地位,以及强调知识之间的过度和联系,是应对这种未来的非常难得的资料!


#3

https://www.chiphell.com/thread-1835153-1-1.html

这个帖子信息比较全。。。