虚幻引擎在全球已经与OEM公布了三款量产车,分别是GMC通用的悍马 EV、凯迪拉克lyric,以及10月份北美刚刚上市的亚马逊投资的Rivian汽车。三款车分别搭载高通不同款型芯片。同时,在国内虚幻引擎也有比较大的突破,11月初华人运通也公布了与Epic Games公司层级的战略合作,合作领域包括HMI、可视化、模拟仿真、以及线上线下的配置器和虚拟展厅等。
未来将会有更多的OEM与行业内的公司选择虚幻引擎开发车机,从技术方面来分析有一个比较重要的因素。虚幻引擎是完全实时化的内容创作的平台,平台上产生的数字资产具有很强的可复制性,并且它对汽车行业几乎所有的应用场景都有较强的数据兼容性。
Epic Games中国技术客户经理 纪大伟
虚幻引擎开发HMI 得天独厚
目前车机对比高性能PC和主机而言,芯片的算力对智能座舱/HMI是一个瓶颈,在项目制作前,需要对已经选型的芯片做硬件芯片的性能分析。根据目标平台,车机的系统做合理的分析,定制出合理的目标是非常重要的第一步。
结合虚幻引擎里面每一个不同的HMI项目,以及项目需求,在引擎编辑器里做相关的功能设置。虚幻引擎引擎内部提供了一套非常强大的性能分析的工具,做数字资产的时候,可以在早期对已有的数字资产进行性能分析和优化,保证可以顺利部署在目标的平台上。
虚幻引擎在游戏领域的数字资产制作,以及虚幻引擎积累了多年的经验。官方HMI demo的目标平台是高通的8155,2.5K的显示屏幕,使用了虚幻引擎4.25版本写入的新的clear coat和半透明玻璃的效果,最终为了稳定运行在车机上。性能方面的目标定的比较高,在保有整体效果的基础上,可以实时运行在60帧以上。
虚幻引擎HMI汽车模型;图片来源:虚幻引擎
在HMI的3D汽车主页面,没有对外饰的基础模型做任何的优化,保持原始的CAD几何结构,外饰的模型大概的面数为27万左右,可在动态的交互过程中,呈现较好的光照和质感,保证产品的高调性,在外饰这个部分,因为没有做任何的裁剪,车身和玻璃的反射效果都非常清晰顺畅。
虚幻引擎自身也提供了性能分析的工具,主要有两套。第一套是通常称之为Console Command,它的好处是方便设计师或者美术人员使用,可以在编辑器里运行,最有价值的是当项目已经打包成安卓的APK,部署到车机终端硬件上的时候,也还是可以继续使用这套命令来做性能分析。第二套工具,虚幻引擎3D的实时渲染非常依赖GPU,所以引擎本身提供了一个工具,专门做非常detail的GPU性能分析。
优化工具
基于Gazelle的项目分成四个方面:
1、将原始CAD模型转成一个真正可以用在HMI方面的多边形车模
虚幻引擎Demo里一共用到了三种车模,除了欢迎页面的主车,在ADAS里也配置了一辆小车,同时也用了HDR,能在ADAS上看到完整的效果。还有一辆是在电池页面里,此车相关的优化主要是集中在材质方面。
3D整车其实一共只有五十万面,如果只考虑polygon,不看效果,其实8155芯片是可以跑到四百甚至五百万的polygon,但是因为叠加了一些高级效果之后就不能只看polygon的数量,在保留外饰原有细节情况不变的基础上,只对内饰做了一些裁剪。
2、简化材质
在画面动起来时,电池页面里的材质动态效果比较炫酷,但是如果在编辑器里默认不对材质做优化,对性能的影响还是比较大的。对项目的材质进行优化,主要有两种方法。
一种是在引擎之外进行,可以用一些专业的做实时的3D贴图工具,做好一整套的模型材质,导出成贴图,再导入虚幻引擎。
第二种方法是不用任何的导入的贴图,只是在引擎里保存一张五颜六色的vertex color作为map,通过RGB不同的通道来提取不同的Mask,给到电池页面里的车的材质,通过选取了不同颜色作为Mask来抠取相应的部分,给相应部分赋予不同材质的效果。在GPU做运算时,仍然把材质看成一个整体,这样在很大程度上就减少了drawcalls的数量。
关于整体的效果,此项目遵循这样一个原则。如果车体某个区域的局部地方细节很多,在屏幕占比又不是很大的情况下,会选用低精度的模型+Normal map的方式。如果某些地方在屏幕里占比比较大,而且表面又比较流畅,没有很多细节的时候就保留原始的高精度模型。
在材质方面,尽量少用贴图,虚幻引擎可以显示材质编辑器里的instruction,尽量减少材质instruction的数量。因为实时渲染在做材质编译的时候,材质的复杂度会严重影响将来实时运行的效率和性能。
虚幻引擎HMI开发界面;图片来源:虚幻引擎
3、对贴图进行优化
贴图对内存的影响非常大,在引擎里有一套科学的算法,简单的有几个规律可循。任何导入虚幻引擎的贴图,它的分辨率应该都是2的乘方,不应该是奇数,而且它的横宽比,如果没有任何条件的限制,最好是正方形,因为正方形的贴图会最大程度的提高内存的使用率。虚幻引擎在贴图导入时,有与贴图相关的压缩选项,虚幻引擎会把一些normal map尽量的设置成DX1。
引擎同时还提供了一套比较科学的计算方法,到底该在某一个特定的或者固定镜头下使用多大尺寸贴图的方法,把最大2K到最小32×32这样六组不同大小的分辨率贴图打包成一个texture pack,在一个动态材质的效果下去预览,当相机或者距离发生变化的时候引擎会自动匹配,去选取合适分辨率的贴图来适应当前的场景,之后把这个贴图作为一个自发光的贴图贴到一个材质上,在动态的过程中就会自动显示当前的颜色以及相应的数字。还可以在贴图的属性面板内重置分辨率,对特定的贴图做优化。
对于整体的资产,除了贴图以外,包括所有的多边形,虚幻引擎有一个工具是用图形化的方式直接显示场景里所有的资产,越大的compound就代表容量越大,它是一个交互类的程序。一般而言一个大的compound,如果双击,就会进入compound的内部,里面就会显示一些在主资产下的其他模型或者贴图。
4、整体光照的解决方案
虚幻引擎是实时动态的生成渲染或者生成光照的工具,可以用一种比较灵活的方式创建光照,首先在场景里生成一个Capture Cube,类似于相机的这样一个物体。在编辑器里,Capture Cube会把做好的一整套光照实时捕捉下来,并且保存到render target里面。
通过Capture Cube,还可以把整个场景所有的光照包括HDR全部实时保存下来。如果对当前的光照效果不满意,也可以做动态的修改,修改完之后再用同样的方式把整个场景光照捕捉下来,最终整个场景的光照就会保存成一整张自定义的HDR,存到硬盘上。
最后把HDR贴到skylight 和反射球上完成整个场景的光照效果。
虚幻引擎HMI界面;图片来源:虚幻引擎
虚幻引擎项目打包
打包会影响两个部分,一个是整个HMI的启动时间,另外是内存占用量,虚幻引擎提供一个工具叫Size MAP,在编辑器里给能够检测哪些资产过大而造成HMI的资源浪费,当虚幻引擎部署到安卓在移动端的设备上之后,虚幻引擎同样提供了一个工具它是命令上工具——UnrealPAK.EXE,在windows的操作系统上直接用命令行启动,它有几个功能:
第一,用extract的命令解压PAK包,解压出来之后会有很多跟项目不相关的文件,手动删除来减少包体大小。
第二,可通过“create”的命令重新对精简过的项目文件打包,整体PAK容量有会大幅度的缩小。
第三,UnrealPAK还可以做整个包体的压缩,但是压缩有双刃剑的性质,如果过度的压缩会影响启动时间,要看具体项目大小是否压缩。
第四,如果已经打包到移动端上,可以通过命令行来查看打包出来的文件及内存占用的信息,通过输入memreport-full,会在打包路径下保存一个log,log里面包含贴图或模型及其他跟内存占用相关的信息。