7月31日,2018云创2018云创大会游戏论坛在杭州国际博览中心103B圆满举行。本场游戏论坛聚焦探讨了可能对游戏行业发展有重大推动的新技术、新实践,如AR、区块链、安全、大数据等。
Unity大中华区技术经理成亮做了《解秘Unity2018最新实时渲染技术》的主题演讲,分享了2018年Unity在实时渲染方面实现的三个重要技术,包括图形相关的可编程渲染管线、基于渲染管线推出的Shader Graph、PostProcess工具以及ECS、Burstcom等性能相关技术。
成亮表示,Unity具有完整的生态环境,一直致力于解决图形、网络以及AR问题,让越来越多的开发者做出炫酷的游戏或者动画。目前,Unity已经开发了大量耳熟能详的游戏,还为电影行业、工业、医疗、汽车等领域提供了远程数据分析、数据追踪、远程调试、货币化等能力。而这其中,一个关键的技术应用就是今年推出的实时渲染相关技术。
Unity实时渲染技术具有强大的跨平台能力,主要包括图形相关的可编程渲染管线、基于渲染管线推出的工具、以及ECS、Burstcom等性能相关的技术。
成亮介绍到,随着游戏种类越来越多,传统的渲染管线已经越来越难以满足游戏功能的需求。而Unity推出的可编程的渲染管线,不仅可以让用户自定义渲染流程,而且具有非常好的扩展性,在保留了经典C++内核的前提下提供了更多的接口。可编程渲染管线提供了两套开源的模板,用户可以根据需求来实现定制化的功能:
HD(High-Definition)主要针对高端的PC平台,这一类管线提供了更加精确的模型和高级材质,在定制渲染管线时对用户更为透明,对于灯光的配置也有所增强,能够帮助用户实现非常华丽的渲染效果;
• Lightweight主要针对移动模块和XR平台,让用户在兼顾性能的同时可以适配到更多的设备。它采用的Single-Pass Forward Rendering可以支持8盏像素光在一个批次内进行渲染,而且提供了非常便利的材质升级工具。
随后,成亮还详细阐述了Unity基于渲染管线所推出的Shader Graph、Progressive Lightmapper和Post-processing v2三个工具:
• Shader Graph是一种节点图方式,能帮助用户无需编程即可创作,极大降低了编程门槛;
• 后处理站提供了丰富的效果功能,支持设置不同的区域和灵活可拓展的框架,此外也兼容最新的可渲染管线;
• 渐进烘焙可以方便用户实时看到烘焙的过程,给用户的工作流带来了非常大的便利和效率提升。今年还会推出基于GPU的渐进光照功能,效率将提升10倍以上。
在性能方面,成亮最后提到,Unity推出的一套新系统,可以帮助用户实现性能上的巨大飞跃。这一系统包括三部分:Job System,帮助用户利用GPU多核处理能力;ECS,让数据的内存排列更为紧密,提高缓存的命中率;Burst Compiler,技术优化的编译器。
以下是成亮演讲实录:
大家好!我是来自Unity的成亮。今天非常高兴有这个机会来到杭州,跟大家分享Unity在2018最新的实时渲染技术。
今天主要分享的内容有四点,首先我会对Unity做一个基本介绍,后面则会介绍今年Unity在实时渲染方面比较重要的三个技术:一是图形相关的可编程渲染管线;二是基于渲染管线推出的工具,包括Shader Graph、PostProcess;三是ECS、Burstcom等性能相关的技术。
首先介绍一下Unity。2014年Unity在丹麦哥本哈根成立,它有三个创始人,他们分别提出了三个公司理念:开发民主化、解决困难问题以及帮助开发者成功。民主化这个概念很好理解,就是降低技术的门槛,让越来越多的开发者能够做出很炫酷的游戏或者动画。相对应来说,就要求Unity公司解决比较困难的图形、网络以及AR问题。
Unity具有完整的生态,它有很强的实时渲染引擎,具备强大的跨平台能力,除此之外还提供了远程数据分析、数据追踪、远程调试、货币化等能力。截止到2017年统计数据,有200亿应用软件安装量,有30亿移动设备是用Unity软件安装的。在排名前1000名的游戏中有40%是用的Unity,新的制作游戏超过了50%,还有60%的VR和AR应用是用Unity来开发的。Unity开发了很多耳熟能详的游戏,以及在电影行业、工业、医疗、汽车等等领域,也有不少厂商用到Unity来做实时渲染的工具。
下面开始介绍实时渲染相关的技术。首先看一下图形方面,今年我们最重点推出的技术是可编程渲染管线,相比之前的管线,可编程渲染管线提供了更多渲染的接口给到开发者,你可以按照自己的需求定义你的开发。当然我们为大家准备好了两个模板:HD(High-Definition)主要针对高端的PC,这个管线提供了更加精确的模型,提供了非常高级的材质,帮助大家能够实现非常华丽的渲染效果;Lightweight主要针对于移动模块,让大家在兼顾性能的同时适配到更多的设备。
这是目前的渲染管线,它可以定制的功能很少,你可以选择Forward或者Deferred:Forward中物体接受的光照数量决定其渲染批次,当光照数量很多时就会遇到新的问题;Deferred中是在最后应用一次光照,但是Deferred有对硬件的要求,所以在某些移动平台是不支持的。 除此之外,还可以编写一些Command Buffer,也就是在渲染管线的时间点,比如上图中绿点的地方,你可以插入自己的渲染。
随着游戏种类越来越多,传统的渲染管线越来越难以满足游戏的需求。比如我们看到有非常3D的、光照非常多的游戏,也有2D的卷轴游戏,这些游戏用一条管线很难兼顾到这样的性能;又比如一个2D的游戏或者一个FPS游戏渲染的时候有很多权衡的点,2D根本不需要光照,材质也不用是基于物理的材质......等等。
所以Unity在今年推出了可编程的渲染管线,它可以让用户自定义渲染流程,比如你的剪裁或者绘制物体,这些流程都可以按照自己需要进行控制。新的渲染管线有非常好的扩展性,针对原来的渲染管线进行了有效的提升,保留了经典的C++内核,提供了更多的接口,帮助大家尽可能化地定制自己的功能。除此之外还提供了两套模板,大家可以根据需要去定制功能,而且这两套功能都是开源的,所以也是给了大家一个非常好的参考。
首先看一下Lightweight,它主要针对移动和XR平台,提供了非常方便的材质升级工具,而且对于一些不需要光照的材质完全兼容,所以升级到这套管线非常方便。它的渲染也和原来有所不同,采用了Single-Pass Forward Rendering,可以支持8盏像素光在一个批次进行渲染。我们之前做了一个Trash Dash实例,它是一个3D游戏,但实际上没有利用到光照,所以它利用我们的材质升级工具,就非常容易从原来的管线升级到了现在的管线。
下面看一下High,High功能很多,在这里就给大家做一个详细的拆解和介绍。它分成六大块功能,首先它的渲染管线有一个比较大的改变,渲染管线相对之前采用了新的模型,物理计算会更精确。它在定制渲染管线时对用户更为透明,用户只要关注设置的属性就可以了,而不用关注选择什么样的管线。它主要针对高端的PC平台,对于灯光的配置有增强,光照和阴影方面可以采用色温来控制光照的颜色。光线形状也有很多选择,还增加了新的区域光。材质比较多,提供了非常多的高级材质,供大家选择。还有基于分层的材质系统,有变形的特效。调试方面,提供了新的可以观察调试的窗口。
新的管线不用再去选择配置,用户根据自己的需求来设置渲染管线就可以了。一是增强了光照配置,能根据色温来控制颜色,支持更多的形状,包括锥形、方形或者金字塔形状,支持光线颜色的效果;二是新增了区域光类型,支持实时区域光,而且区域光形状包括了橘型、圆形等形状;三是提供了新的光照模型GGX,在传统模式下是单显色模型,粗糙表现颜色不会饱和,而且会带有发暗的现象;此外还新增了非常多的材质,包括彩虹色加透明漆材质的效果、双面透明的效果、分层的模型、体积光和光速效果、No Occlusion Probe效果等等。
除此之外,新的管线还新增了调试窗口,在这个窗口中可以看到丰富的信息,包括材质、光照等等。如下所示,这个图可以看到正在渲染的物体表面的发线,它不光可以在编辑器上面使用,还可以实时连到PC端上进行查看。
在调试窗口支持只显示某一种光照,比如只显示慢反射。还支持中间的渲染目标,比如Depht Buffer显示,左边只显示了Diffuse Lightin。
以上给我们展示的是Unity可编程渲染管线所能够呈现出的实时渲染的效果。下面我们看一下方便大家创作的工具,Shader Graph、Progressive Lightmapper和Post-processing v2。
Shader Graph是一种节点图的方式,来帮助大家无需再用编程的方式进行创作。它带来的好处是不用编码,可能减少了一些语法或者调试的痛苦,降低了大家编程的门槛。
后处理站有非常多可以选择的效果,可以设置不同的区域,还支持灵活可拓展的框架,因为这也是一个开源的功能,所以大家可以根据需要去看,一方面提供了自定义的API,大家可以自定义,另外也可以看到整个代码。另外也兼容最新的可渲染管线。
再看一下渐进光照烘焙,实时渲染场景有很多灯光是先静态烘焙上取得,尤其是像间接光照,都是烘焙上去的,因为如果实时计算肯定来不及,所以通常在做项目的时候有光照烘焙的功能。而渐进烘焙可以实时看到烘焙的过程,而且可以优先看到视图窗口显示的效果,这样给大家工作流就带来了非常大的便利和提升。除此之外,今年应该还会推出基于GPU的渐进光照功能,这样光照烘焙效率就会提升10倍以上。
今年在性能上面Unity推出了一套新的系统,可以帮助大家在性能上面有质的飞跃。最新的系统包括三个部分:一是Job System,帮助你利用GPU多核处理能力;二是ECS,能够让我们数据的内存排列更紧密,提高缓存的命中率;三是Burst Compiler,是技术优化的编译器。
如上所示,这是现在的系统。其中会引用到各种各样的组件,它就是一个引用列表。这样一来,这些引用类型没有办法控制它在内存中的排布,所以它是分散在内存中的,这样数据分散的结果是导致缓存命中率比较低。还有一个问题,如果单核的情况,一旦任务比较多,它处理的速度就会越来越慢。
Entity Component System中,我们把数据和函数分开,Render包含了数据,通过对数据进行分类处理,再派发给不同的任务进行处理。如下所示,这就是一个结合的架构图。
来看一个实际的例子,来看它具体提升了多少性能。如下图显示,传统方式下飞船包含了Movemen组件,在这种情况下,同屏渲染了18500个飞船。但是再加入变形,在飞船里面就没有了任何的应用。所有的任务都是通过函数来执行的,所以把它Job system变形化之后,性能大概可以提升到25000个,提升了三分之一的性能。
再看ECS With Job system,数据紧密化加上并行化之后,在ESC With Job system情况下,我们从最开始的18000个变成了96000个,性能提高了5倍。再加上Burst Compiler,数量达到了156000个,比最开始的做法性能提升了接近10倍。
以上就是Unity最新的关于实时渲染的技术进展,希望能够帮助到开发者能够实现更炫酷的效果,谢谢大家。