熟悉了这些HDRP设置,分分钟提高渲染性能

来源: Unity官方平台

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


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

HDRP 10 版本:
https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-defini...@10.4/manual/whats-new-10.html

HDRP的UX组成

在开始分析 HDRP 渲染的画面之前,我们首先要了解 HDRP 的现有功能。

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

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

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

01 全局设置

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

Graphics(图形):
https://docs.unity3d.com/Manual/class-GraphicsSettings.html

图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 着色器框架,所以这部分属性被另外放在了一个包中。

02 质量等级

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

Quality Settings:
https://docs.unity3d.com/Manual/class-QualitySettings.html

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

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

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

图2:HDRP的Quality设定中包含了更少的在属性界面中的设置

图3:因为许多属性被放到了HD Render Pipeline Asset中

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

同内置渲染管线一样,HDRP 同样需要借助 Cameras(摄像机)来渲染场景。管线还会在同一对象上加上一个 HD Additional Camera Data(HD 摄像机补充数据)组件来为每个摄像机储存额外的参数。

Cameras(摄像机):
https://docs.unity3d.com/ScriptReference/Camera.html

HD Additional Camera Data:
https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-defini...@11.0/api/UnityEngine.Rendering.HighDefinition.HDAdditionalCameraData.html

实际上 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:

图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 所示。

04 Volume(体积)系统

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

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

Volume 面板:
https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-defini...@10.2/manual/Render-Pipeline-Debug-Window.html

图5:Render Pipeline Debug窗口中的Volume覆写堆栈

这些代码写出来的默认属性可在 HDRP Default Settings 选项卡的 Volume Component 部分覆写。注意,这里的覆写依旧能被场景中的体积所覆盖。

而摄像机会反过来取场景各体积属性的混合值。如果体积属性不存在,摄像机就会取 HDRP Default Settings 下的属性值。否则,它就会取写入代码中的默认属性值。

如图 5 所示,Render Pipeline Debug 窗口的 Volume 面板可以很好地显示出 Volume 属性的覆写堆栈,以及当前启用中的体积属性,辅助图形调试。

05 网格和表面

类似内置渲染管线,HDRP 的几何体渲染通常由场景的 Mesh Renderer(网格渲染器)或 Skinned Mesh Renderer(蒙皮网格渲染器)完成。HDRP 独有的渲染数据主要存储在 Materials(材质) 中,以方便应用到兼容的 Renderer(渲染器)或 Shader Graphs 上。

Mesh Renderer(网格渲染器):
https://docs.unity3d.com/ScriptReference/MeshRenderer.html

Skinned Mesh Renderer(蒙皮网格渲染器):
https://docs.unity3d.com/ScriptReference/SkinnedMeshRenderer.html

06 光照

类似内置渲染管线,HDRP 的每盏灯都会被存储为 HDRP 特有的数据格式。管线除了常规 Light 组件外还会使用 HD Additional Light Data(HD 光照补充数据)组件,因为许多光照设置并非来自关联了 Light 组件的 Game Object 上。

下方为几个例子:

  • 间接光照将受 Light Probe Groups(光照探针组)、Reflection Probes(反射探针,带有 HD Additional Reflection Data(HD 反射补充数据)组件)、Planar Reflection Probes(平面反射探针)及 Lighting Settings(光照设置)影响。光照本身也可以由 Indirect Lighting Controller(间接光照控制器)体积组件进行调整。
  • 体积系统决定了天空的光照。
  • 体积系统也还控制着相关的屏幕空间效果。这些效果类似于一个光源或阴影源:Screen Space Reflection(屏幕空间反射)、Screen Space Refraction(屏幕空间折射)、Screen Space Global Illumination(屏幕空间全局光照)、Screen Space Ambient Occlusion(屏幕空间环境遮蔽)及 Contact Shadow(接触阴影)。
  • Subsurface Scattering(次表面散射)模拟了“表面到表面的光照”。大多数次表面散射属性由 Diffusion Profiles(散射配置)设定,而后者又定义在了材质中。你可以在体积系统中用 Diffusion Profile Override(散射配置覆写)覆盖其属性。

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

属性搜索

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

图7:在HDRP项目中查找图形属性的一种可行流程

图形设置的多个维度

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

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

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

01 多层设置间的冲突

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

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

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

图8:每个等级都有一个给定值

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

图9:用等级来替代具体数值

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

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

02 三种设置层次的重叠

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

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

以下三层设定会互相重合:

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

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

图10:Shader Graph中的Material Quality

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

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

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

图12:在摄像机的Frame Settings(帧设置)中设定新的材质质量等级

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

关于优化 HDRP 设置的详细内容,欢迎跳转 Unity 社区学习:
https://developer.unity.cn/projects/6189ca70edbc2a05bb60b145

最新文章