虚幻引擎和光线追踪带来的启示

本篇文章的题目采用的是“启示”而不是“变革”,这是因为移动端的游戏引擎依然在遵循自己的策略慢慢地实现全局光线追踪。移动端游戏社区都想实现光线追踪,但是存在不可抗力的原因:硬件的性能不够,不能满足帧率的要求。因此,Imagination一直在致力优化移动端,并推出了PowerVR光线追踪硬件IP核。

本篇文章主要分为两部分,分别从不同的角度进行阐述。第一部分讨论的是美术相关的问题以及游戏场景资源的生成:几何、颜色、纹理、表面属性和光源。第二部分介绍的是将软件工程集成到虚幻引擎(UE)中来,并采用Imagination PowerVR GR6500硬件平台以及Vulkan驱动中扩展的光线追踪API。

第一部分:美术(游戏美工抱怨:“我只是想让它漂亮些,为什么会变成这样?”)

毫无疑问,游戏制作美工都想要实现光线追踪效果(提供准确的反射、折射和投射阴影的一键式解决方案)。因为这将会使他们将更多的精力放在美学研究方面,而不是专注于游戏资源的适应技巧从而使得游戏场景显得更加的真实。

我们注意到,光线追踪的解决方法类似于反射探测、屏幕空间和平面反射外加额外的眩光效果,但是它们都有明显的光学限制。在屏幕空间内,物体的反射是不可见的,物体的背面也是没有反射效果的。平面反射通常是采用比较生硬的方式来实现,比如通过巧妙的重新定位相机对场景进行重新渲染。实际上这种方法只适用于平面,而且在移动端由于性能的限制这个功能通常会被禁止。

游戏美工通常花费大量的时间定位和测试反射探测节点以及其它光发射节点,为的是让场景更具视觉冲击力。当然,如果游戏是打算在移动设备上运行,那么我们不得不限制反射探测节点的数量,因为每一帧都需要将它们重新生成来涵盖所有的动画。这种解决方法通常需要成百上千个小时来进行处理以达到预期的效果。当然,这些都需要我们人工实时查看处理过程以确保所有游戏资源预期进行处理。

可以验证的是光线追踪的阴影更加精确而且不需要过多的密集型处理,结果就是更低的功耗以及性能的提升。目前创建非光线追踪的阴影缓存比较复杂而且很容易出现各种问题。从根本上讲,它们是深度图像文件,从光点角度来看它们表示的是距离。由于实际文件大小的限制它们只占用游戏场景的一小部分。一般用于静态物体,对于动画对象每一帧都需要重新加载处理,这会增加处理器的负载。而且如果阴影继承到颜色属性中,那么对于透明的物体也是有问题的。适当的模糊阴影长度能够增加真实感,但是不通过光线追踪或者动态深度测量是不可能实现的。如果渲染引擎采用全局光线追踪就不会出现这些问题。(注:在写这篇文章时我们还没有将混合单光线软阴影算法添加到虚幻引擎支持中)。为了能够显著提升投射阴影的表现力,Imagination的光线追踪方案会区别对待阴影光线,尤其那些不透明的物体。

游戏场景的其他方面,如管道、材质、模型、光源和物体表面都可以通过光线追踪引擎实现流线型的表现效果。现在游戏美工社区特别期待移动端硬件能够支持光线追踪。尽管,即使有了光线追踪特性也还有很多工作要做,但是花费更多时间使游戏场景变得更加漂亮也是值得的。

虚幻引擎和光线追踪带来的启示

第二部分:科学(真正重要的来了)

这个项目的目标是集成光线追踪特性,使之确保光线跟踪效果与现有的光栅效应同等重要。举个例子,当材料的表面属性需要反射效果,那么这个材料的着色器需要编译来投射合适的反射光线。我们付出了很多努力来尊重虚幻引擎(UE)的架构,以便所有效果都能够放在一起很好的展示出来。这意味着你的游戏可以选择光线追踪反射搭配映射阴影在同一个场景同一时刻存在。为了能够实现这个功能,引擎需要编译材料着色器的光线追踪变量,当二次光线在场景内交织时依然能够保持正常。

虚幻4引擎支持桌面版Linux和OpenGL 3.x和4.x已经有一段时间了,2015年年底的时候,初始版本又增加了对Vulkan 1.0的支持,但是只兼容Windows和安卓系统,2016年2月在MWC大会上Epic公司正式发布了这个消息,并展示了一个名为ProtoStar的Demo运行在三星Galaxy S7手机上。现在来自虚幻4引擎Gihub社区的Yaakuro实现了引擎与Vulkan同时运行在桌面版Linux系统上,并且在英伟达桌面版GPU上进行了展示。

2016年5月,我们启动了一个项目,将虚幻4引擎运行在PowerVR GR6500系统上,起初是在常规光栅模式下,但不久后增加l了对光线追踪功能的支持。由于虚幻4引擎代码库的架构,默认仅在移动平台上支持OpenGL ES 2.x和3.x,且在Linux系统只支持桌面版OpenGL 4.x。同时我们也决定扩展Vulkan跨平台API,使得在桌面版Linux主机上支持我们的“移动端”GPU。

我们只花了几周时间就熟悉了Yaakuro所做的工作,并根据当前虚幻4引擎代码库对其项目进行了更新,实现了在英伟达GPU上移植Vulkan API。从次以后就可以简单地实现Vulkan设备管理切换为GR6500板卡,并使用Imagination开发的Vulkan驱动程序,只需要对SDL库做些微小的调整就可以让引擎好像是在X window上渲染,实际上是在渲染评估系统HDMI的输出画面。

项目停顿了一段时间,因为我们已经非常熟悉虚幻4引擎的代码库,并且与在UK的工程师协作完成和稳定了Vulkan驱动程序,同时我们开始计划使用Vulkan光线追踪扩展API向虚幻引擎中添加基础的光线追踪功能。

最初阶段涉及到调节引擎的渲染传递机制来执行光线场景的构建操作,使用Vulkan光线追踪扩展API非常简单,因为修改的代码非常类似Vulkan现在的光栅渲染,使用开始/结束命令包装渲染次序,使用带有顶点和光线着色器的Vulkan管道对象取代常规的光栅着色器。我们还可以重复使用现在的“静态网格”几何图形来绘制一个环路,适当调整来移除投影碎片的可见性检查,我们希望所有的几何体都能够被渲染到光线追踪的层次结构中。

我们能够准确的使用与光栅渲染相同的顶点着色器(有引擎编译生成),仅需要改变一些参数值来控制顶点的转换使得顶点的输出在世界场景中而不是投影的屏幕空间中。起初,我们使用手写的光线着色器,编写自己的代码实现控制,仅要求顶点属性结构能够匹配顶点着色器(这种方式只需要在引擎编译之前解析顶点着色器的GLSL资源)。

这让我们能够一次性的完成场景搭建和光线追踪渲染,我们增加了基本颜色、光源、阴影和反射属性,最后一步是展示测试,在游戏画面中光线追踪图形应该叠加在常规的光栅图形上面。

下一步就是让引擎能够根据实际的场景材料自己生成光线着色器,采用材料和着色器跨编译器机制使得我们你能够增加其他着色器类型,尽管引擎只是将它们作为第二像素(碎片)着色器,从USF着色器文件资源衍生而来(USF资源定义了常规的像素着色器)。然后Vulkan RHI层会将二次USF像素着色器转换为GLSL,将GLSL资源代码转换为光线着色器,最后会将其编译到SPIR-V资源文件中。在引擎的高层次中的材料代码会创建像素着色器的二次副本(也就是说相关参数是相同的),然后将它传递给RHI,因为它只接收二次像素着色器实际上我们这里给它传递的是光线着色器副本。最后与像素着色器的绑定方式相似,它会准确的绑定所有相同的材质资源。

虽然是一个全局的光线追踪渲染器,但是实际上它是常规像素着色器行为的复制或者说几乎相同,包括映射/CSM阴影、反射探针反射以及所有相同的光源变体(光源图、方向光、可选的点光源等)。

使用USF内置的功能来调节引擎的HLSL解析器一般会将光线追踪的一些细节(输入和输出光线管理、与光线着色器绑定的参数)隐藏起来。这使得USF着色器代码包含了更多功能,如检查输入光线的深度(用于光线反射调节)、发射反射和阴影光线以及统计光线追踪累积缓存中的最终颜色值,不使用额外非常的语法。这些调用的函数会转换为GLSL,而且这些函数的实现会添加到GLSL代码中,作为从像素着色器向光线着色器的转换代码。

使用一些预处理程序,可以使用USF的像素着色器代码快速搭建出基本的光线着色器,仅需要添加10行代码和调节,就可以实现光线追踪反射和图像深度统计。其他部分重组的USF代码需要添加光线追踪阴影,只需要将光源计算放到阴影计算之前,这样我们就可以实现动态切换是选择光栅(映射/CSM查找)还是光线追踪(递归统计)阴影效果。

展示的这个Demo是在常规引擎说明场景基础上扩展的一个版本,引擎可以自由切换为光栅模式还是光栅追踪模式。尽管在光线追踪模式下,我们也可以在光栅和光线追踪阴影之间选择以及颜色取样和光线追踪反射效果。我们还增加了其他一些材料用于在渲染模式下每种材料表面参数设置。举个例子,因为这个初始版本的光线追踪反射实现方案不支持光滑(或模糊)反射,我们展示了如何设置使得一些材料可以继续使用模糊探测反射,其他材料使用光线追踪实现真正的光滑反射效果。

最后我们演示了光线追踪的灵活性,提供可选的摄像机模型和第四种渲染模式,即使用真正的360度球面透镜渲染整个场景。

后面的工作我们会涉及到动态几何图形,支持点光源,重新实现和优化我们开发的混合单射线软阴影算法。

本篇文章作者Will Anielewicz,高级软件工程师(PowerVR,Imagination); Simon Eves,高级软件工程师(PowerVR,Imagination)。

Will Anielewicz简介
Will自从1967年就开始与计算机打交道,在1974年获得了纽约大学计算机科学荣誉学位,同时具有多学科硕士学位,包括美术、计算机科学和心理学。曾被授权开发一个计算机图形钢琴,并在现场演唱会上演出。1976年在加拿大多伦多艺术画廊,Will作为嘉宾参加了世界上第一次计算机图形艺术展览。在1982年Will作为第一个员工参与了玛雅三维软件的开发。自从那以后,Will参与了14部特效电影(例如星际前战:幽灵的威胁)和多个商业获奖广告的创作。现在Will在Imagination科技作为一名高级软件工程师,研究和开发PowerVR光线追踪。他的目标是推动计算机图形学的发展,尤其在计算机视觉和增强现实方面。

Simon Eves简介
Simon是Imagination科技的一名高级图形学工程师,在旧金山分部已经工作了六年。之前他从事了长达十五年的软件开发和电影和电视视觉效果技术美工工作,工作地点遍布伦敦和湾区。在收购Caustic图形公司后,Simon作为第一名员工参与了硬件光线追踪架构的开发,也就是现在的PowerVR Wizard架构的前身。

英文链接: https://www.imgtec.com/blog/unreal-engine-and-the-ray-tracing-revelation/
声明:
本文为原创文章,转载需注明作者、出处及原文链接,否则,本网站将保留追究其法律责任的权利

--电子创新网--
粤ICP备12070055号