搜索 Unity

熟悉HDRP设置,提高渲染性能

2021年10月22日 类别 技术 | 13 分 阅读
Graphic of city streets created by HDRP
Graphic of city streets created by HDRP
分享

学习怎样在高清渲染管线(HDRP)设置中一次达成最高性能和高画质。

HDRP的10版本支持Unity 2020 LTS及以上,新版的HDRP软件包将继续优化用户友好的界面、灵活的功能、管线的稳定性和总体性能。但如果想将HDRP设置到最佳状态,你必须要了解所有主要的管线设置,及其背后的原理和作用。为此,我们需要利用CPU/GPU Profiler的记录、Render Pipeline Debug视图,以及HDRP的着色器框架来研究HDRP的运行。

从图形调试到优化分析,本文将介绍一些实用技巧,帮助大家使用Custom Pass API及其它功能来定制HDRP。

HDRP的UX组成

在开始分析HDRP渲染的画面之前,我们首先要了解HDRP的现有功能。我们曾举办过一系列的演讲来介绍HDRP:Unite Now-HDRP实现高保真游戏画面Unity实时光线追踪技术实践系列在线教学,以及Volumetric Clouds, Lens Flare and Light Anchor讲座。

你可能会发现,项目要从内置渲染管线移植到HDRP通常需要先做一些调整。这是因为:

  • HDRP使用着一种统一 且符合真实物理的 渲染框架,各项渲染属性的单位与现实世界一致,如用于设置摄像机的感光度Exposure(曝光值),描述光照强度的Candela(坎德拉)。我们的Unite Now 讲座会教大家怎样在设置场景光照时根据真实物理来得出一致的渲染参数。
  • HDRP项目包含有大量的渲染参数可由用户调整。因为HDRP集成了许多功能,并且管线也支持让艺术和工程人员深度定制渲染功能、微调和优化自己的作品。

要想熟悉HDRP的各项功能,我们首先要了解管线的Global(全局)设置。

全局设置

在内置渲染管线中,每个项目的Graphics(图形)设置涵盖了大多数图形设置。而Player设置则包含了Windows、Linux、Mac或Xbox等平台的基础图形设置。

Image of where the graphics setting can be found in HDRP projects
图1:HDRP里的各个全局图形设置。

HDRP同样包括了Graphics和Player设置,此外还增加了三组额外设置,用于修改管线的高级默认配置。

  • 在图形设置中,Scriptable Render Pipeline(可编程渲染管线SRP) 设置默认是HD Render Pipeline Asset(HD管线设置资源)。这个资源中的设置可在每一种管线的质量等级上被分别覆写。
  • HDRP Default Settings(默认设置)一栏则可配置:
    • 默认Frame(帧)设置,每个属性可在多台摄像机(包括用于平面反射或反射探针的摄像机)上分别覆写。你可以在此处设定摄像机默认是否渲染透明物体。
    • 默认Volume(体积)组件,其属性可在所有摄像机上覆写。比如,你可以覆写默认的后处理效果强度,再使用体积来让后处理效果“室外强、室内弱”。
    • 默认Diffusion Profile Assets(散射配置资源)属性,属性可由HDRP Defautl Setting选项栏下Volume(体积)部分的Diffusion Profile Override组件进行覆写,并且也支持在所有摄像机上覆写。目前Diffusion Profile系统还带有一个“多余的覆写层面”,为了改善HDRP的用户体验,我们正在积极寻求其解决方案。
    • 属于纯全局设置的其它属性不能被覆写。
  • 而其它不太常用的底层设置则放在了HDRP Config package中。这些设置也属于纯全局设置,修改起来涉及重新编译C#程序集和HDRP着色器框架,所以这部分属性被另外放在了一个包中。

质量等级

内置渲染管线支持在Quality Settings一栏下设定任意数量的质量等级 。每个质量等级都可以保留各自的图形设置,比如在低端设备上减少使用各向异性纹理来节省硬件资源。

HDRP也支持为每个质量等级指定一种HD Render Pipeline Asset覆写。与内置渲染管线相比,高清渲染管线的设置资源可储存额外几种参数,如平行光点光源和聚光灯以及面光源的同屏最大数量,颜色分级的LUT大小Light Cookie整图大小等等,让管线能有更多的定制空间。

内置渲染管线的Quality Settings有许多只适用于本管线的属性。在HDRP中,这些设置可能会从原位转移到其他地方,作为“替补设置”重新出现。

比如,内置渲染管线的Quality Settings选项栏可设定Shadow Resolution(阴影分辨率)属性,而同样的设置在HDRP项目中就被放在了管线设置资源的“Lighting” > “Shadows” 这一部分。

Screenshot of properties in the quality settings within a built-in render pipeline project vs a HDRP project
图2:HDRP的Quality设定中包含了更少的在属性界面中的设置。
Many properties in the quality settings are moved to the HD Render Pipeline Asset
图3:因为许多属性被放到了HD Render Pipeline Asset中。

Camera(摄像机)和Frame(帧)设置

同内置渲染管线一样,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的覆写堆栈。

使用Camera面板

下例说明了Render Pipeline Debug窗口下Camera面板的使用方式:

场景中有一个名为Main Camera 的摄像机,此Main Camera只渲染静态物体。HDRP Default Settings选项卡默认启用运动矢量的绘制,而Main Camera的Frame Settings为了提高整体性能会禁用这一功能。

Motion Vectors覆写堆栈会在Default Frame设置的左侧显示出Overridden(覆写后) 的Frame设置。见图4选框A:

Frame Settings override stack displayed by the Render Pipeline Debug window
图4:Render Pipeline Debug窗口中的Frame Settings覆写堆栈

窗口内Overridden Frame设置的左边显示的是Sanitized(清理后) Frame设置。“清理(Sanitization)”过程可让Overridden Frame设置保持连贯。在同个例子中, Main Camera的Frame Settings覆写并没有禁用Opaque Object Motion(不透明物体运动)和Transparent Object Motion(透明物体运动),但由于Motion Vector被禁用,这三种依赖于此的功能也会被清理系统关闭,如图4选框B所示:

Volume(体积)系统

我们在Unite Now 讲座上已经讲过HDRP支持的Volume系统。类似于内置渲染管线的Post-processing堆栈,HDRP的体积系统也是一种后处理。但它要比前者更详细,体积系统还涵盖了天空的渲染方式间接光照的强度额外的阴影设置以及许多其他特性。

简单地说,HDRP体积系统是一种抽象的框架,可在镜头移动时改变其渲染设置。每种体积属性都带有默认值,这些值可在Render Pipeline Debug窗口的Volume面板中查看。在图5的最右侧我们能看到,Lens Distortion(镜头扭曲)的Default Intensity(默认强度)为0。

Volume override stack displayed by the Render Pipeline Debug window
图5:Render Pipeline Debug窗口中的Volume覆写堆栈

这些代码写出来的默认属性可在 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上。下方为几个例子:

Indirect Lighting Controller Volume component
图6:Indirect Lighting Controller(间接光照控制器)体积组件

属性搜索

在大致了解了HDRP的UX组成后,我们再来看些比较冷门的HDRP图形属性。图7展示的是一种从一般设置到覆写设置、“自上而下”的属性查找方法。可以看到,从上方的总体设置到下方的覆写设置,查找的范围在扩大。

one possible routine to search for graphics properties in your HDRP project
图7:在HDRP项目中查找图形属性的一种可行流程。

图形设置的多个维度

HDRP的图形设置必须要应对以下几方面:

  • 程序的图像质量等级,根据运行平台的不同而不同
  • 当前活跃的摄像机
  • 摄像机在场景中的位置
  • 模型上使用的材质
  • 照射在模型上的光照

并且,HDRP的设置有几个不同的维度。

多层设置间的冲突

下方列举出的设置之间往往会存在冲突:

  • 质量等级和活跃中摄像机可能会试着控制同一个图形参数。举例来说,如果你想在低端设备上减少Subsurface Scattering的采样次数,最好也修改Render Textures 摄像机的Subsurface Scattering采样次数,以达到画中画效果。
  • 质量等级和摄像机位置可能会试着控制同一个图像参数。在GPU算力有限的平台上,部分场景的复杂光照效果已经占用了大量的处理时间,而在这些地方优化性能时,你可以尽量降低后处理效果的质量,节省一些性能预算。
  • 质量等级和光照设置可能会试着控制同一个图像参数。在内存有限的平台上,如果你想通过降低阴影贴图的分辨率来优化性能,不要忘了场景中存在的小型聚光灯也需要使用低分辨率的阴影贴图。

为了解决这些冲突,高清渲染管线支持多级 设定。某个属性不只有一个值,而可以有几个等级的数值,比如低级、中级、 高级甚至终极。

value specified for each tier
value specified for each tier
value specified for each tier
图8:每个等级都有一个给定值。

在渲染画中画效果的摄像机上,你可以为后处理体积和接收阴影贴图的聚光灯设定一个等级:

Specify tiers rather than values.
Specify tiers rather than values.
Specify tiers rather than values.
图9:用等级来替代具体数值。

HDRP这时就可在HD Render Pipeline设置资源中找到每种等级对应的属性值,管线便会使用该属性。

当然,摄像头、体积和光照也可以忽略分级设置系统,直接执行它们想要的行为。

三种设置层次的重叠

我们再到另一个例子中看看重叠的设置层次。 

在某个场景中有一些Mesh Renderer,每个都带有Shader Graph编写而成的复杂顶点动画。对低端设备来说,顶点动画的性能开销过于高昂。而若想制作出画中画效果,你还需要用到另外一个摄像机,这个摄像机并不需要渲染顶点动画。

这里,有三层设定会互相重合:

  • 场景模型上的材质
  • 程序的质量等级
  • 场景中的摄像机

为了解决这种情况,Shader Graph设有一个特殊的Material Quality(材质质量)

The Material Quality keyword in Shader Graph
图10:Shader Graph中的Material Quality

与用户为每个材质设置的普通Shader Graph节点不同,Material Quality是一个全局节点,存在于HDRP之内。在HD Render Pipeline设置资源中,你可以在Material Quality预设的几种等级中选择、设置默认的等级。

The Available Material Quality Levels and Default Material Quality Level
图11:Default Material Quality Level中预设的几种质量等级

你可以在每个摄像机上修改默认帧设置、设定材质质量等级,覆盖HDRP配置文件的设置。

Specifying Material Quality Level from a camera’s Frame Settings override
图12:在摄像机的Frame Settings(帧设置)中设定新的材质质量等级

HDRP有一个系统性的设置流程可让美术人员也能轻松驾驭,我们认为良好的用户体验是刺激高质量内容创作的关键之一。

优化HDRP设置

默认设置下的HDRP项目会花费较多的性能,因为管线默认使用了许多功能。我们建议用户亲自控制HDRP设置,只使用需要的功能。

为了展示什么是最小渲染工作量,我们来创建一个包含225个立方体的场景,方块使用默认材质,场景由一个聚光灯、一个点光源、一个平行光和环境光照射。

Scene of 225 cubes example
图13:简单的示例场景

这个场景的性能表现如何呢?让我们构建一个使用IL2CPP脚本后端、禁用VSync、分辨率为2880x1620的独立运行版。程序在搭载英特尔i9-10980HK CPU和NVIDIA RTX2080 GPU的Windows设备上运行时,Profiler分析显示每帧的平均渲染时间为4.6毫秒。

仔细研究Profiler的时间轴,我们发现大量的时间花在了DXGI.WaitOnSwapChain 进程上,表明程序更为依赖GPU。

Both the Built-in Render Pipeline and HDRP tests are GPU bound.
图14:内置渲染管线和HDRP的测试场景都更为依赖GPU渲染。

使用Nsight Graphics记录GPU进程后,我们发现HDRP默认激活了几种功能才导致渲染嫉妒依赖GPU。

  • 这些效果包括SSAO、Subsurface Scattering(次表面散射)、Dynamic Exposure(动态曝光)、Motion Blur(运动模糊)和Bloom(泛光)。
  • 有多条Color Pyramid通道和一条Upsampling Low-res Transparent通道在运行,所有通道都支持复杂的透明渲染。
HDRP has many effects and passes turned on by default.
图15:HDRP默认情况会启用很多特效与渲染通道。

正如这里所展示的,你可以修改HDRP配置文件、覆盖摄像机的帧设置、添加体积覆写,让管线只使用最少的功能。换句话说:

  • Decal(贴花)、Low-res Transparency(低分辨率透明度)、Transparent Backface(透明背面)、Depth Prepass(深度预处理)、Depth Postpass(深度后处理)、SSAO(屏幕空间环境光遮蔽)、SSR(屏幕空间反射)、Contact Shadow(接触阴影)、Volumetics(体积)、Subsurface Scattering(次表面散射)和Distortion(扭曲)都可在HDRP配置文件中禁用。
  • Refraction(折射)、Post-Process(后处理)、After Post-Process(后后处理)、Transmission(透射)、Reflection Probe(反射探针)、Planar Reflection Probe(平面反射探针)和Big Tile Prepass(大图块预通道)都可在摄像机的帧设置中禁用。
  • 体积组件可将Exposure模式覆写为Fixed Exposure。

修改之后,每帧的平均渲染时间降低到了2.45毫秒,这点提升相比于内置渲染管线非常大。

在实际制作中,游戏的主摄像头不一定需要关闭特别多的渲染功能,但额外的摄像头上是可以关的。

如果你想实现性能更高的摄像机,你可以试着使用2021.2中的HDRP UI Camera Stacking包,用多个开销远小于标准摄像机的摄像机来渲染UI。

链接中的例子着重展示了HDRP性能特征的可定制性,还展示了自行控制HDRP项目设置的必要性。

内容预告

Unity branded raytraced ball image

Unity即将推出HDRP的使用指南

我们将于晚些时候推出的决定版HDRP使用指南,从技术上深入探讨光照的复杂性,帮助你充分利用起HDRP。

2021年10月22日 类别 技术 | 13 分 阅读
相关文章