DXR时代——实时渲染新纪元

4月25日的分享会在B22如期举行,此次分享由柳喆俊老师主持,分享嘉宾是2016级动画专业的罗昊亮同学,他为大家分享了关于实时渲染的相关内容。

首先,罗昊亮同学为大家介绍了微软公司的DirectX,他解释到Microsoft DirectX是微软开发的一个应用接口(API),用来增强计算机多媒体功能,包括加速视频卡和声卡驱动程序,为不同类型的多媒体提供更好的播放效果,微软将其定义为“硬件设备无关性”,包括DRAW,3D,SOUND等,利用这些API接口可以直接访问显卡、声卡等硬件并让以windows为平台的游戏或多媒体应用程序获得更高的执行效率,比如使多媒体播放速度更快,效果更好。

总的来说,DirectX 和 OpenGL 都是建立在硬件API之上的API。它的存在主要有两点优势:一是开发者可以调用统一的API来进行上层开发,而不用考虑移植性问题;二是方便玩家快速安装游戏。

SEED - Project PICA PICA - Real-time Raytracing Experiment using DXR (DirectX Raytracing) (1)

其次,罗昊亮同学介绍了下Direct X Raytracing的概念与其功能。他讲到Direct X Raytracing相当于是DirectX 应用接口中负责光线跟踪的模块,是一个新的渲染流程。

那如何实现DXR呢?其原理是加入了一个全新的管线专门执行光线追踪的任务,让GPU发起任务的方式除了现有的光栅化渲染和通用计算方式以外,新增添了一个追踪光线的调用功能。如果说传统光栅化的管线是以一个三角形为单元,通过将三角形变后形成成像素的过程,那光线追踪的管线则是以一跟光线为单元,描述光线的求交和求交后计算的过程。和光栅化线性管线不同之处是光线追踪的管线可以通过递归调用TraceRay()函数来衍生出另一根光线,并且执行另一个管线的实例。

就光线追踪的算法而言,光线的反射、折射、散射式比较常见,整个系统的设计是要保持光线(ray)的独立处理,所有与ray有关的shader、ray都是作为一个输入,在每个shader里面不能和其它ray进行交互,也不能依赖于其它线程中的ray。尽管有些ray的运行结果会产生其它的ray,但是运行中的任何ray之间都是不能有依赖关系,这样就为并行性提供了可能性,即DXR在D3D12中成为和compute并行计算与rasterization一样的一等公民。

与rasterization管线类似,DXR管线的目标也是保持可编程能力和固定管线之间的平衡,可编程能力要最大化应用程序的表达能力,而固定管线的目的是最大化执行和实现的效率。新管线中新增的可编程逻辑也就是新加入的5种着色器(Shader),分别是Ray Generation、Intersection、Any Hit、Closest Hit、Miss。

Raytracing with DirectX 12

接着,罗昊亮同学提出疑问:DXR真的实现了实时光线跟踪吗?

他继续分析到,DXR真的实现了实时光线跟踪。只要是符合光线跟踪的框架就算是实现光线跟踪,即便如此,其仍然存在较多的局限性。虽然新的管线赋予了GPU新的功能,解决了光线跟踪无法在GPU上使用的问题,但是在数以万亿记的光线给计算机所带来巨大的计算量负荷下,想要完全用光线跟踪来渲染画面,一般情况下是无法达到每秒60帧的。

在原理上,光线追踪相较于光栅化,前者更适合用来渲染特效。实时渲染方式对于场景中环境的遮挡、阴影、反射都有非常“近似”的求解方法,这些方法也都有因为各种“近似”效果带来各种弊端,例如渲染阴影时的Shadow Mapping,因其采样率和屏幕空间的采样率不一致,因此导致需要渲染者花费大量时间手动调节参数来达到理想的画面效果。对于环境遮挡,传统的屏幕空间算法得到的结果往往更加像边缘检测,基本上就是把所有边角都暗化处理了,呈现的画面效果一般是在物体周围都会有一圈黑边。

Experiments with DirectX Raytracing in Northlight

最后,罗昊亮同学提到了渲染中关于如何高效处理画面光线反射的相关内容。

他说对于反射,一般通用的解决方案是屏幕空间反射加上预计算的环境捕捉贴图(Light Probes)。对于屏幕空间反射(Screen Space Reflections,SSR),主要是没有办法渲染到屏幕外被反射到的三角形。对于Light Probes,预计算过程中通常会只计算视角光线和着色表面垂直的情况,这使得Glossy反射的结果丢失了许多有趣的特性,例如视角低角度时的反射拉长等。此时就需要渲染者权衡一下准确与速度两者之间的关系,要达到实时,每秒就得达到60帧,因此通过减少光线的数量,严格限制光线的反弹次数,只在最需要用光线跟踪的地方使用光线跟踪,即可实现快速实时渲染。

由于每一帧的时间预算只有16毫秒,能承受的样本预算远远不够我们得到一个可靠的渲染方程的解,随之而来的结果就是,因为采样数量不足,渲染出来的画面会有大量的噪点。但经过了很多针对极低样本数量的光线追踪结果进行实时降噪的研究之后,实时光线跟踪的渲染终于取得了突破性的发展,达到了可以实用的程度。

Time Ray Tracing Demo - Project Spotlight - Unreal Engine

微软对于DXR的定位和发展路线比较清晰,第一步是作为光栅化的一个辅助,用来实现一些光栅化做不到的事情,或者做起来质量很差的事情;第二步是在大量的使用过程中改进GPU光线追踪算法的基础架构,最后才是替代光栅化。

光线追踪的算法架构很简洁,并且几乎能够统一在同一个基础框架下真正实现几乎所有全局光照效果,目前Pixar的RenderMan都在致力于将以前需要针对单独的效果使用特定渲染通道的方法逐步转变为一个统一的路径追踪渲染通道。

但值得一提的是,未来的光线追踪采样方法还存在很大改善空间,DXR出现的意义是在实时渲染方式的正确道路上迈出了第一步,同时DXR也是API发展史上的一大步,即便其现在还只是光栅化渲染的辅助。实时画面在画质的提升以及realtime raytracing的发展前景,还需要业界每一位工作者的辛勤付出与共同努力。

分享会结束以前,金云水老师又对光线跟踪的基本概念进行了更加详细的补充,进一步巩固了同学们的基础知识。

参考资料:

[1] https://blogs.msdn.microsoft.com/directx/2018/03/19/announcing-microsoft-directx-raytracing/

[2]https://zhuanlan.zhihu.com/p/34851503

[3]https://www.zhihu.com/question/28323641

[4]http://www.mamicode.com/info-detail-2009722.html

[5]http://www.elecfans.com/d/664601.html

[6]https://learnopengl.com/Getting-started/Hello-Triangle

[7]https://zhuanlan.zhihu.com/p/34894883

[8]https://zhuanlan.zhihu.com/p/35106724

(审稿:柳喆俊)

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180505G0X3S900?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券