学习怎样在高清渲染管线(HDRP)设置中一次达成最高性能和高画质。
HDRP的10版本支持Unity 2020 LTS及以上,新版的HDRP软件包将继续优化用户友好的界面、灵活的功能、管线的稳定性和总体性能。但如果想将HDRP设置到最佳状态,你必须要了解所有主要的管线设置,及其背后的原理和作用。为此,我们需要利用CPU/GPU Profiler的记录、Render Pipeline Debug视图,以及HDRP的着色器框架来研究HDRP的运行。
从图形调试到优化分析,本文将介绍一些实用技巧,帮助大家使用Custom Pass API及其它功能来定制HDRP。
在开始分析HDRP渲染的画面之前,我们首先要了解HDRP的现有功能。我们曾举办过一系列的演讲来介绍HDRP:Unite Now-HDRP实现高保真游戏画面、 Unity实时光线追踪技术实践系列在线教学,以及Volumetric Clouds, Lens Flare and Light Anchor讲座。
你可能会发现,项目要从内置渲染管线移植到HDRP通常需要先做一些调整。这是因为:
要想熟悉HDRP的各项功能,我们首先要了解管线的Global(全局)设置。
在内置渲染管线中,每个项目的Graphics(图形)设置涵盖了大多数图形设置。而Player设置则包含了Windows、Linux、Mac或Xbox等平台的基础图形设置。
HDRP同样包括了Graphics和Player设置,此外还增加了三组额外设置,用于修改管线的高级默认配置。
内置渲染管线支持在Quality Settings一栏下设定任意数量的质量等级 。每个质量等级都可以保留各自的图形设置,比如在低端设备上减少使用各向异性纹理来节省硬件资源。
HDRP也支持为每个质量等级指定一种HD Render Pipeline Asset覆写。与内置渲染管线相比,高清渲染管线的设置资源可储存额外几种参数,如平行光、点光源和聚光灯以及面光源的同屏最大数量,颜色分级的LUT大小和Light Cookie整图大小等等,让管线能有更多的定制空间。
内置渲染管线的Quality Settings有许多只适用于本管线的属性。在HDRP中,这些设置可能会从原位转移到其他地方,作为“替补设置”重新出现。
比如,内置渲染管线的Quality Settings选项栏可设定Shadow Resolution(阴影分辨率)属性,而同样的设置在HDRP项目中就被放在了管线设置资源的“Lighting” > “Shadows” 这一部分。
同内置渲染管线一样,HDRP同样需要借助Cameras(摄像机)来渲染场景。管线还会在同一对象上加上一个HD Additional Camera Data(HD摄像机补充数据)组件来为每个摄像机储存额外的参数。
实际上HDRP带有更为详细的摄像机定制参数。管线带有几种Physical Camera(物理摄像机)设置,你甚至可以勾选Custom Frame Settings属性,在Frame Settings(帧设置)中确定镜头框架的绘制方法。
Frame Settings(帧设置)系统由一组摄像机属性的覆写组成,其默认设置可在HDRP Default Settings一栏中设定。此外,每台摄像机都支持覆写默认的框架设置。
Render Pipeline Debug窗口的Camera面板可以可视化显示出Frame Settings的覆写堆栈。
下例说明了Render Pipeline Debug窗口下Camera面板的使用方式:
场景中有一个名为Main Camera 的摄像机,此Main Camera只渲染静态物体。HDRP Default Settings选项卡默认启用运动矢量的绘制,而Main Camera的Frame Settings为了提高整体性能会禁用这一功能。
Motion Vectors覆写堆栈会在Default Frame设置的左侧显示出Overridden(覆写后) 的Frame设置。见图4选框A:
而 窗口内Overridden Frame设置的左边显示的是Sanitized(清理后) Frame设置。“清理(Sanitization)”过程可让Overridden Frame设置保持连贯。在同个例子中, Main Camera的Frame Settings覆写并没有禁用Opaque Object Motion(不透明物体运动)和Transparent Object Motion(透明物体运动),但由于Motion Vector被禁用,这三种依赖于此的功能也会被清理系统关闭,如图4选框B所示:
我们在Unite Now 讲座上已经讲过HDRP支持的Volume系统。类似于内置渲染管线的Post-processing堆栈,HDRP的体积系统也是一种后处理。但它要比前者更详细,体积系统还涵盖了天空的渲染方式、间接光照的强度、额外的阴影设置以及许多其他特性。
简单地说,HDRP体积系统是一种抽象的框架,可在镜头移动时改变其渲染设置。每种体积属性都带有默认值,这些值可在Render Pipeline Debug窗口的Volume面板中查看。在图5的最右侧我们能看到,Lens Distortion(镜头扭曲)的Default Intensity(默认强度)为0。
这些代码写出来的默认属性可在 HDRP Default Settings 选项卡的Volume Component部分覆写。注意,这里的覆写依旧能被场景中的体积所覆盖。
而摄像机会反过来取场景各体积属性的混合值。如果体积属性不存在,摄像机就会取HDRP Default Settings下的属性值。否则,它就会取写入代码中的默认属性值。
如图5所示,Render Pipeline Debug窗口的Volume面板可以很好地显示出Volume属性的覆写堆栈,以及当前启用中的体积属性,辅助图形调试。
类似内置渲染管线,HDRP的几何体渲染通常由场景的Mesh Renderer(网格渲染器)或Skinned Mesh Renderer(蒙皮网格渲染器)完成。HDRP独有的渲染数据主要存储在Materials(材质) 中,以方便应用到兼容的Renderer(渲染器)或Shader Graphs上。
类似内置渲染管线,HDRP的每盏灯都会被存储为HDRP特有的数据格式。管线除了常规Light组件外还会使用HD Additional Light Data(HD光照补充数据)组件,
因为许多光照设置并非来自关联了Light组件的GameObject上。下方为几个例子:
在大致了解了HDRP的UX组成后,我们再来看些比较冷门的HDRP图形属性。图7展示的是一种从一般设置到覆写设置、“自上而下”的属性查找方法。可以看到,从上方的总体设置到下方的覆写设置,查找的范围在扩大。
HDRP的图形设置必须要应对以下几方面:
并且,HDRP的设置有几个不同的维度。
下方列举出的设置之间往往会存在冲突:
为了解决这些冲突,高清渲染管线支持多级 设定。某个属性不只有一个值,而可以有几个等级的数值,比如低级、中级、 高级甚至终极。
在渲染画中画效果的摄像机上,你可以为后处理体积和接收阴影贴图的聚光灯设定一个等级:
HDRP这时就可在HD Render Pipeline设置资源中找到每种等级对应的属性值,管线便会使用该属性。
当然,摄像头、体积和光照也可以忽略分级设置系统,直接执行它们想要的行为。
我们再到另一个例子中看看重叠的设置层次。
在某个场景中有一些Mesh Renderer,每个都带有Shader Graph编写而成的复杂顶点动画。对低端设备来说,顶点动画的性能开销过于高昂。而若想制作出画中画效果,你还需要用到另外一个摄像机,这个摄像机并不需要渲染顶点动画。
这里,有三层设定会互相重合:
为了解决这种情况,Shader Graph设有一个特殊的Material Quality(材质质量):
你可以在每个摄像机上修改默认帧设置、设定材质质量等级,覆盖HDRP配置文件的设置。
HDRP有一个系统性的设置流程可让美术人员也能轻松驾驭,我们认为良好的用户体验是刺激高质量内容创作的关键之一。
默认设置下的HDRP项目会花费较多的性能,因为管线默认使用了许多功能。我们建议用户亲自控制HDRP设置,只使用需要的功能。
为了展示什么是最小渲染工作量,我们来创建一个包含225个立方体的场景,方块使用默认材质,场景由一个聚光灯、一个点光源、一个平行光和环境光照射。
使用Nsight Graphics记录GPU进程后,我们发现HDRP默认激活了几种功能才导致渲染嫉妒依赖GPU。
正如这里所展示的,你可以修改HDRP配置文件、覆盖摄像机的帧设置、添加体积覆写,让管线只使用最少的功能。换句话说:
修改之后,每帧的平均渲染时间降低到了2.45毫秒,这点提升相比于内置渲染管线非常大。
在实际制作中,游戏的主摄像头不一定需要关闭特别多的渲染功能,但额外的摄像头上是可以关的。
如果你想实现性能更高的摄像机,你可以试着使用2021.2中的HDRP UI Camera Stacking包,用多个开销远小于标准摄像机的摄像机来渲染UI。
链接中的例子着重展示了HDRP性能特征的可定制性,还展示了自行控制HDRP项目设置的必要性。
我们将于晚些时候推出的决定版HDRP使用指南,从技术上深入探讨光照的复杂性,帮助你充分利用起HDRP。
Is this article helpful for you?
Thank you for your feedback!