去年5月13日虚幻引擎公布时,视频效果非常惊人,当时我看的真是心潮澎湃。
不知不觉已经过去一年,虚幻引擎5也如约而至。不过这一年来官方透漏了不少消息,加上各路大佬不断深挖,已经少了那种神秘感。但是我还是非常期待的,也在第一时间看了直播并下载。
编辑器、源码、文档、入门课程、Demo工程,官方全都给了而且汉化也很全,可以说是非常用心了。
虚幻引擎5中文技术文档
https://docs.unrealengine.com/5.0/zh-CN/
虚幻引擎5源码地址(两个分支 ue5-main 应该是Epic的开发分支)
https://github.com/EpicGames/UnrealEngine/tree/ue5-early-access
虚幻引擎5官方入门课程链接
https://www.unrealengine.com/zh-CN/onlinelearning-courses/ue5-early-access-quickstart
总结一下新的功能或特性:
Nanite和Lumen确实主打的功能。直接从Bridge里面拖点资产,开启Nanite,加上lumen,直接出作品,已经在网上看到不少大佬秀效果了(lumen有的情况下噪点比较明显)。
对于游戏开发来说,WorldPartition、GameplayFeaturePlugin、FullBodyIK、Root Motion Warpping、ControlRig这些都是实打实的好工具,对团队来说非常有意义。UE5虽然架构上变化不大,但是这些改动真的不少了。
目前遇到的一些问题:
下面再帮大家回顾一下Nanite和Lumen两大核心技术,感兴趣的朋友可以了解一下:
Nanite,中文翻译为虚拟微多边形体几何体技术,简单来说就是引擎可以在运行时支持包含几乎无限个三角面的模型,即美术们可以将拥有数以亿计的多边形的模型直接导入到虚幻引擎中使用。
科普一下,我们常见的三维游戏世界(或CG场景)一般都是由三角面构成的,计算机通过对三角面逐个渲染从而展示出整个画面。一个3A游戏场景往往由数千万个三角面构成(包括人物、地形、建筑等),而一个科幻电影更是夸张到需要对数亿甚至数十亿的三角面进行渲染。
显然,三角面的数量越多,渲染的速度就越慢(虽然现在的显卡越来越强大),所以对于需要实时渲染的游戏来说,除了想尽办法剔除不展示的三角面,减少可见的三角面也是一个不得不做的妥协。
那么如何减少可见的三角面呢?技术上我们可以采用LOD动态减少三角面的数量(边坍缩技术)。但工业界常用的手段是在一开始就限制主模型的面数,一般会先在Zbrush里制作高模,然后烘焙置换贴图或法线贴图到低模上(保存更多的细节信息用于渲染流程中的光照计算),这样一个面数很低的模型也能表现出接近高模的效果。
显然这是为了性能的不得已而为,关注点集中在艺术效果的美术们必然不喜欢这冗余而繁杂的流程。相比画面效果,程序们当然更关注技术细节。从名字“虚拟微多边形”的“虚拟”二字,我们就很容易联想到操作系统中的虚拟内存技术。“虚拟内存”技术的核心思想是将硬盘虚拟为内存,通过动态替换的方式解决内存空间不足的问题(当然还有其他很多方面的意义)。
同理,渲染领域也有一个原理类似的技术称为“虚拟纹理”,由于GPU的显存有限,无法将一个复杂大场景的纹理全部存储,因此可以将这些纹理合成之后再存储到硬盘中。在渲染时根据屏幕上用到的资源索引进行实时更新,图形大神卡马克在2000年左右就成功地将纹理虚拟化技术应用在了游戏毁灭战士3(Doom 3)中。
按照这个思路,几何模型似乎也可以做“虚拟化”。其实类似的技术很早就出现了,上世纪80年代初,卢卡斯影业图形学部门几位大师做出的REYES渲染架构,把参数化曲面动态细分成微多边形,再用算法筛选出接近1像素大小的微表面并进行渲染。卡马克后来尝试了这种方案,但是由于几何体存储方式特殊、GPU管线性能等原因,该方案在很长一段时间没有达到预期的效果,毕竟硬件基础决定上层建筑。
Reyes Rendering on the GPU
https://markussteinberger.net/papers/GPUReyes.pdf
不过很快,随着Compute shader的出现,显卡可以做更多通用的计算,原来复杂且效率较低的渲染管线也可以通过Mesh Shader的方式进行优化,Billion级别的三角形绘制似乎变得可能。
Epic作为长期研究各种引擎技术(CEO Tim 就曾将REYES和光追定位成为了两大GPU的发展方向)并不断落地工业界的领军者,在Compute shader出现的第一时间就抓住了机会,公开了虚幻5的虚拟微多边形体几何体技术的演示Demo,轰动了整个行业。从官方透漏的信息来看,出于对通用性的考虑,他们并没有使用英伟达提供的Meshshader技术而是直接利用ComputeShader做软光栅,同时配合自定义的算法做像素级别的三角面剔除,真正的实现了无限制的“LOD”。
很巧的是,最近网易雷火工作室在虚幻5正式公布前发布了类似Nanite的“无矩渲染技术”,同样也是采用3D扫描技术+ComputeShader(确切的说是MeshShader,与虚幻5不同)的方式来实现高精度模型的渲染,从而能够支持面数高达二十一亿的游戏场景。而且他们已经将场景发布到了逆水寒的周版本更新包,足以看出几何模型虚拟化技术已经部分应用到实际生产环境中,前景也逐渐明朗起来。
3D扫描建模技术在《逆水寒》端游中的落地应用
https://zhuanlan.zhihu.com/p/371775421
Lumen,是一个全动态全局光照解决方案,可以实时对场景和光照变化做出反应而无需专门的光线追踪硬件。因为光线的反射,在现实环境中你很难看到一个物体没有任何颜色(即使他处于一个很暗的角落里)。全局光照(GI)简单来说就是模拟真实环境中光线可以近乎无限次反射到各个地方的效果,实现全局光的核心思想就是光线追踪,也就是需要正确计算光线会击中哪些三角面。然而实际情况中我们往往会采用光照贴图预先烘焙的方式,在避免大量实时计算的同时实现质量相对较高的效果,因此你会发现很多游戏的场景中光照效果都是几乎不变的。
GI技术其实一直在被研究和使用,主要从硬件和软件两个方面进行优化。硬件方面主要使用RTX技术做加速计算,软件方面主要使用各种自定义的加速结构来简化计算,比如基于体素(voxel)和基于屏幕空间的的全局光照算法。Lumen就是一个结合了软件层面的多个全局光照算法的方案,对于远处的场景使用体素计算,近处的使用屏幕空间的光线追踪修正。
Lumen的优越之处在于它每次更新光源时不需要等待贴图的烘焙和频繁地修改光照贴图UV,从而大幅度提高美术的工作效率。同时,配合Nanite技术,可以实现非常精细和逼真的反射效果。
其实这里有一个很有意思的点,为了高效地实现理想的渲染效果,人们一直在三维空间着色和屏幕空间着色中反复横跳。三维模型太多?那我们拿到屏幕空间去统一处理(Pixel shader)。GPU性能上来了但屏幕空间效果不完美?要不再回去优化一下模型的着色逻辑。拓展一下,其实我们经常遇到类似的问题,运行速度太慢?先把数据缓存到内存里。内存占用太大?那我实时去计算结果。很多时候,我们就是在对各种方案做取舍,而且随着技术(比如硬件)的发展,之前很老的方案可能就会再次被利用起来(实时光追,深度学习等)。
关于虚幻引擎,其实接触的多了,就会发现Unreal是一个结果导向的引擎,用户想要什么功能我们就做什么。由于Epic的团队本身也是游戏开发者,所以他们同时也是虚幻引擎最为忠实的用户,可以从用户的角度考虑大家的需求,我想这也是Unreal备受广大美术和策划喜爱的原因。相比之下,Unity看起来更追求架构上的完美以及技术上的革新,他们会实时地更新各种前沿的技术和设计(如深度学习框架),不断调整和优化代码框架(DOTS)。虽然也在努力提供各种工具支持,但毕竟精力有限,短期内容易造成各项工具链功能不完善、使用体验差的问题。了解过二者发展历史和未来的Roadmap的朋友都可以理解,哪有什么各方面都无敌的引擎,不过是数十年来无数从业者一点点的积累和优化罢了。
期待虚幻5的进一步表现,也期待数字时代的真正到来。身处信息革命的浪潮中,我们既是历史的见证者,也是历史的参与者。加油!