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

学习怎样在高清渲染管线(HDRP)设置中一次达成最高性能和最高质量。
随着 Unity 2020 LTS 及更高版本的 HDRP 版本 10 的发布,HDRP 包继续优先考虑其用户友好的界面、灵活的功能、稳定性和整体性能。但如果想将HDRP设置到最佳状态,你必须要了解所有主要的管线设置,及其背后的原理和作用。这就是为什么我们要从 CPU/GPU Profiler 捕获、 渲染管道调试视图和 HDRP 的着色器框架的角度来研究 HDRP 如何运行。
从图形调试到分析和优化,本博客将提供一些技巧来帮助您使用 Custom Pass API或软件包的其他本地部分为您的项目定制 HDRP。
在开始分析HDRP渲染的画面之前,我们首先要了解HDRP的现有功能。我们建议您观看我们的Unite Now演示文稿、 使用 HDRP 实现游戏高保真图形、 使用 Unity 高清渲染管线进行光线追踪网络 研讨会,以及 体积云、镜头眩光和光锚 讲座,这些都是 HDRP 的绝佳指南。
你可能会发现,项目要从内置渲染管线移植到HDRP通常需要先做一些调整。这是因为:
- HDRP 具有统一的基于物理的渲染框架,这意味着它的属性使用真实世界的单位:曝光值 用于表示相机光敏度,而 坎德拉 用于表示光强度。我们的Unite Now演讲 揭示了如何以基于物理的方式思考以在照亮场景时获得一致的结果。
- HDRP项目包含有大量的渲染参数可由用户调整。因为HDRP集成了许多功能,并且管线也支持让艺术和工程人员深度定制渲染功能、微调和优化自己的作品。
要想熟悉HDRP的各项功能,我们首先要了解管线的Global(全局)设置。
全局设置
对于内置渲染管道, 图形 设置涵盖了大多数每个项目的图形设置。还有 播放器 设置,其中包含特定目标平台(例如 Windows、Linux、Mac 或 Xbox)环境下的一些常规图形设置。

HDRP同样包括了Graphics和Player设置,此外还增加了三组额外设置,用于修改管线的高级默认配置。
- 例如,在图形设置中, 可编写脚本渲染管线 (SRP) 设置引用默认的 高清渲染管线资源。此高清渲染管道资产包含可在每个 质量级别覆盖的设置。
- HDRP 默认设置选项 卡配置:
- 默认 帧 设置,具有可以为每个相机(包括用于平面反射或反射探针的相机)覆盖的默认属性。你可以在此处设定摄像机默认是否渲染透明物体。
- 默认 体积 组件,包含可针对每个“场景中的摄像机位置”覆盖的属性。例如,您可以定义默认的后期处理效果强度,该强度可以被覆盖,并使用场景中的特定 体积 变为“室外强,室内弱”。
- 默认扩散配置文件资源属性,可以通过 HDRP 默认设置选项卡的体积组件部分中的 扩散配置文件覆盖 组件覆盖。并且也支持在所有摄像机上覆写。目前Diffusion Profile系统还带有一个“多余的覆写层面”,为了改善HDRP的用户体验,我们正在积极寻求其解决方案。
- 属于纯全局设置的其它属性不能被覆写。
- 最后,HDRP 配置包中指定了一些不太可能需要配置的低级设置。这些设置也属于纯全局设置,修改起来涉及重新编译C#程序集和HDRP着色器框架,所以这部分属性被另外放在了一个包中。
质量等级
使用内置渲染管道,您可以 在“质量设置” 选项卡中定义多个质量级别。每个质量等级都可以保留各自的图形设置,比如在低端设备上减少使用各向异性纹理来节省硬件资源。
具体来说,对于 HDRP 项目,可以为每个质量级别选择一个覆盖的 高清渲染管线资产 。与内置渲染管线相比,这提供了更多的可配置性,因为高清渲染管线资源存储了多个参数,例如屏幕上 定向、 准时和 区域 光源的最大数量、 颜色分级 LUT 大小、 光源 cookie 图集大小等等。
内置渲染管线的Quality Settings有许多只适用于本管线的属性。在HDRP中,这些设置可能会从原位转移到其他地方,作为“替补设置”重新出现。
例如,在内置渲染管道项目中,“质量设置”选项卡控制 “阴影分辨率” 属性。然而,在 HDRP 项目中,高清渲染管线资源的“照明”>“阴影”部分控制阴影贴图的分辨率。


Camera(摄像机)和Frame(帧)设置
要在 HDRP 中渲染场景,您需要像在内置渲染管道中一样添加 摄像机 。HDRP 还使用额外的 高清附加摄像机数据 组件(附加到同一个游戏对象)来存储额外的每个摄像机参数。
实际上HDRP带有更为详细的摄像机定制参数。有几种 物理相机 设置,如果勾选相机的 自定义框架设置 属性,您可以决定相机如何通过 框架设置 系统绘制框架。
Frame Settings(帧设置)系统由一组摄像机属性的覆写组成,您可以在 HDRP 默认设置选项卡中指定帧设置的默认值。最重要的是,每个摄像机都可以 覆盖 默认的 Frame 设置。
渲染管道调试窗口 的 摄像机面板 有助于可视化帧设置覆盖堆栈。
使用相机面板
下例说明了Render Pipeline Debug窗口下Camera面板的使用方式:
场景中有一个相机,称为主相机 (Main Camera)。此Main Camera只渲染静态物体。HDRP Default Settings选项卡默认启用运动矢量的绘制,而Main Camera的Frame Settings为了提高整体性能会禁用这一功能。
运动矢量覆盖堆栈在 DefaultFrame 设置左侧显示 OverriddenFrame 设置的状态。见图4选框A:

此外,渲染管道调试窗口会在 OverriddenFrame 设置左侧显示 SanitizedFrame 设置的状态。“清理(Sanitization)”过程可让Overridden Frame设置保持连贯。查看相同示例,不透明物体运动和透明物体运动尚未在主摄像机的帧设置覆盖中被明确禁用。但由于Motion Vector被禁用,这三种依赖于此的功能也会被清理系统关闭,如图4选框B所示:
Volume(体积)系统
正如我们在Unite Now演讲中所讨论的,HDRP 支持 体积系统。与内置渲染管线中的 后处理堆栈 类似,HDRP Volume 系统控制后处理。甚至,它还决定了 天空的渲染方式、 间接光的强度、以及 一些阴影设置等功能。
简单地说,HDRP体积系统是一种抽象的框架,可在镜头移动时改变其渲染设置。每种体积属性都带有默认值,要查看这些值,请使用“渲染管道调试”窗口中的 “音量”面板 。在图5的最右侧我们能看到,Lens Distortion(镜头扭曲)的Default Intensity(默认强度)为0。

这些硬编码的默认属性可以通过 HDRP 默认设置选项卡的体积组件部分中的属性覆盖来覆盖。注意,这里的覆写依旧能被场景中的体积所覆盖。
而摄像机会反过来取场景各体积属性的混合值。如果体积属性不存在,摄像机就会取HDRP Default Settings下的属性值。否则,它就会取写入代码中的默认属性值。
如图5所示,Render Pipeline Debug窗口的Volume面板可以很好地显示出Volume属性的覆写堆栈,以及当前启用中的体积属性,辅助图形调试。
网格和表面
就像在内置渲染管道中一样,要渲染的几何图形通常由场景中的 网格渲染器 或 蒙皮网格渲染器 指定。HDRP 特定的数据主要存储在 材质中,以便它们可以使用适当的渲染器或 着色器图表。
光照
与内置渲染管线一样,HDRP 项目具有 灯光 ,并且每个灯光都有特定于 HDRP 的数据存储。高清附加灯光数据 组件与常规灯光组件一起附加。
因为许多光照设置并非来自关联了Light组件的GameObject上。下方为几个例子:

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

HDRP的图形设置必须要应对以下几方面:
- 程序的图像质量等级,根据运行平台的不同而不同
- 当前活跃的摄像机
- 场景中相机的位置
- 模型上使用的材质
- 照射在模型上的光照
并且,HDRP的设置有几个不同的维度。
多层设置间的冲突
下方列举出的设置之间往往会存在冲突:
- 质量等级和活跃中摄像机可能会试着控制同一个图形参数。例如,如果您想减少低端设备上的次表面散射采样次数,您可能还想减少渲染纹理以实现画中画效果的相机的次表面散射采样次数。
- 质量等级和摄像机位置可能会试着控制同一个图像参数。在GPU算力有限的平台上,部分场景的复杂光照效果已经占用了大量的处理时间,而在这些地方优化性能时,你可以尽量降低后处理效果的质量,节省一些性能预算。
- 质量等级和光照设置可能会试着控制同一个图像参数。在内存有限的平台上,如果你想通过降低阴影贴图的分辨率来优化性能,不要忘了场景中存在的小型聚光灯也需要使用低分辨率的阴影贴图。
为了解决这些冲突,高清渲染管线资产支持分层设置。您不仅可以为某个属性指明一个值,还可以将多个值归属于多个层级 — — 低、中、高,在某些情况下还有超级层级。



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



HDRP这时就可在HD Render Pipeline设置资源中找到每种等级对应的属性值,管线便会使用该属性。
当然,摄像头、体积和光照也可以忽略分级设置系统,直接执行它们想要的行为。
三种设置层次的重叠
我们再到另一个例子中看看重叠的设置层次。
在某个场景中有一些Mesh Renderer,每个都带有Shader Graph编写而成的复杂顶点动画。对低端设备来说,顶点动画的性能开销过于高昂。而若想制作出画中画效果,你还需要用到另外一个摄像机,这个摄像机并不需要渲染顶点动画。
这里,有三层设定会互相重合:
- 场景模型上的材质
- 程序的质量等级
- 场景中的相机
为了解决此类情况,Shader Graph 中有一个特殊的 Material Quality 关键字:


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

HDRP有一个系统性的设置流程可让美术人员也能轻松驾驭,我们认为良好的用户体验是刺激高质量内容创作的关键之一。
默认设置下的HDRP项目会花费较多的性能,因为管线默认使用了许多功能。我们建议用户亲自控制HDRP设置,只使用需要的功能。
为了表示简约的渲染工作负载,让我们使用默认材质创建一个由 225 个立方体组成的 场景 ,并由聚光灯、点光源、定向光和环境光照明。


使用 Nsight Graphics 进行 GPU 捕获表明发生这种情况的原因是 HDRP 默认启用了几个功能:
- 这些效果包括SSAO、Subsurface Scattering(次表面散射)、Dynamic Exposure(动态曝光)、Motion Blur(运动模糊)和Bloom(泛光)。
- 有多条Color Pyramid通道和一条Upsampling Low-res Transparent通道在运行,所有通道都支持复杂的透明渲染。

正如您 在此处看到的,您可以控制 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 2020 LTS 中的 HDRP 为您带来了改进的工具,可用于在游戏中创建令人回味的高端灯光。获取这份新的深入指南,了解如何利用 HDRP 中基于物理的照明的强大功能。
