<a href="https://mp.weixin.qq.com/s/y5iQZGSrJithguqtjIJEaw"><font color="#9a9a9a"><u>来源: Unity官方平台</u></font></a>
HDRP 的 10 版本支持 Unity 2020 LTS 及以上,新版的 HDRP 软件包将继续优化用户友好的界面、灵活的功能、管线的稳定性和总体性能。但如果想将 HDRP 设置到最佳状态,你必须要了解所有主要的管线设置,及其背后的原理和作用。为此,我们需要利用 CPU/GPU Profiler 的记录、Render Pipeline Debug 视图,以及 HDRP 的着色器框架来研究 HDRP 的运行。
<center><img width="600" src="http://imgtec.eetrend.com/files/2021-11/%E5%8D%9A%E5%AE%A2/100555425-22…; alt=""></center><br>
从图形调试到优化分析,本文将介绍一些实用技巧,帮助大家使用 Custom Pass API 及其它功能来定制 HDRP。
HDRP 10 版本:
https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-defin…
<font size="3" style="line-height: 45px;" color="#c200ff"><strong>HDRP的UX组成</strong></font>
在开始分析 HDRP 渲染的画面之前,我们首先要了解 HDRP 的现有功能。
你可能会发现,项目要从内置渲染管线移植到 HDRP 通常需要先做一些调整。这是因为:
<ul><li>HDRP 使用着一种统一且符合真实物理的渲染框架,各项渲染属性的单位与现实世界一致,如用于设置摄像机的感光度 Exposure(曝光值),描述光照强度的 Candela(坎德拉)。</li>
<li>HDRP 项目包含有大量的渲染参数可由用户调整。因为 HDRP 集成了许多功能,并且管线也支持让艺术和工程人员深度定制渲染功能、微调和优化自己的作品。</li></ul>
要想熟悉 HDRP 的各项功能,我们首先要了解管线的 Global(全局)设置。
<font style="line-height: 40px;" color="#c200ff"><strong>01 全局设置</strong></font>
在内置渲染管线中,每个项目的 Graphics(图形)设置涵盖了大多数图形设置。而 Player 设置则包含了 Windows、Linux、Mac 或 Xbox 等平台的基础图形设置。
Graphics(图形):
https://docs.unity3d.com/Manual/class-GraphicsSettings.html
<center><img width="600" src="http://imgtec.eetrend.com/files/2021-11/%E5%8D%9A%E5%AE%A2/100555425-22…; alt=""></center><center><font color="#9a9a9a"><em>图1:HDRP 里的各个全局图形设置</em></font></center><br>
HDRP 同样包括了 Graphics 和 Player 设置,此外还增加了三组额外设置,用于修改管线的高级默认配置。
在图形设置中,Scriptable Render Pipeline(可编程渲染管线 SRP)设置默认是 HD Render Pipeline Asset(HD 管线设置资源)。这个资源中的设置可在每一种管线的质量等级上被分别覆写。
HDRP Default Settings(默认设置)一栏则可配置:
<ul><li>默认 Frame(帧)设置,每个属性可在多台摄像机(包括用于平面反射或反射探针的摄像机)上分别覆写。你可以在此处设定摄像机默认是否渲染透明物体。</li>
<li>默认 Volume(体积)组件,其属性可在所有摄像机上覆写。比如,你可以覆写默认的后处理效果强度,再使用体积来让后处理效果“室外强、室内弱”。</li>
<li>默认 Diffusion Profile Assets(散射配置资源)属性,属性可由HDRP Defautl Setting选项栏下 Volume(体积)部分的 Diffusion Profile Override 组件进行覆写,并且也支持在所有摄像机上覆写。目前 Diffusion Profile 系统还带有一个“多余的覆写层面”,为了改善 HDRP 的用户体验,我们正在积极寻求其解决方案。</li>
<li>属于纯全局设置的其它属性不能被覆写。</li></ul>
而其它不太常用的底层设置则放在了 HDRP Config package 中。这些设置也属于纯全局设置,修改起来涉及重新编译 C# 程序集和 HDRP 着色器框架,所以这部分属性被另外放在了一个包中。
<font style="line-height: 40px;" color="#c200ff"><strong>02 质量等级</strong></font>
内置渲染管线支持在 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” 这一部分。
<center><img width="600" src="http://imgtec.eetrend.com/files/2021-11/%E5%8D%9A%E5%AE%A2/100555425-22…; alt=""></center><center><font color="#9a9a9a"><em>图2:HDRP的Quality设定中包含了更少的在属性界面中的设置</em></font></center>
<center><img width="600" src="http://imgtec.eetrend.com/files/2021-11/%E5%8D%9A%E5%AE%A2/100555425-22…; alt=""></center><center><font color="#9a9a9a"><em>图3:因为许多属性被放到了HD Render Pipeline Asset中</em></font></center><br>
<font style="line-height: 40px;" color="#c200ff"><strong>03 Camera(摄像机)和Frame(帧)设置</strong></font>
同内置渲染管线一样,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-defin…
实际上 HDRP 带有更为详细的摄像机定制参数。管线带有几种 Physical Camera(物理摄像机)设置,你甚至可以勾选 Custom Frame Settings 属性,在 Frame Settings(帧设置)中确定镜头框架的绘制方法。
Frame Settings(帧设置)系统由一组摄像机属性的覆写组成,其默认设置可在 HDRP Default Settings 一栏中设定。此外,每台摄像机都支持覆写默认的框架设置。
Render Pipeline Debug 窗口的 Camera 面板可以可视化显示出 Frame Settings 的覆写堆栈。
<font style="line-height: 40px;" color="#c200ff"><strong>使用 Camera 面板</strong></font>
下例说明了 Render Pipeline Debug 窗口下 Camera 面板的使用方式:
场景中有一个名为 Main Camera 的摄像机,此 Main Camera 只渲染静态物体。HDRP Default Settings 选项卡默认启用运动矢量的绘制,而 Main Camera 的 Frame Settings 为了提高整体性能会禁用这一功能。
Motion Vectors 覆写堆栈会在 Default Frame 设置的左侧显示出 Overridden(覆写后) 的 Frame 设置。见图 4 选框 A:
<center><img width="600" src="http://imgtec.eetrend.com/files/2021-11/%E5%8D%9A%E5%AE%A2/100555425-22…; alt=""></center><center><font color="#9a9a9a"><em>图4:Render Pipeline Debug窗口中的Frame Settings覆写堆栈</em></font></center><br>
而窗口内 Overridden Frame 设置的左边显示的是 Sanitized(清理后) Frame 设置。“清理(Sanitization)”过程可让 Overridden Frame 设置保持连贯。在同个例子中,Main Camera 的 Frame Settings 覆写并没有禁用 Opaque Object Motion(不透明物体运动)和 Transparent Object Motion(透明物体运动),但由于 Motion Vector 被禁用,这三种依赖于此的功能也会被清理系统关闭,如图 4 选框 B 所示。
<font style="line-height: 40px;" color="#c200ff"><strong>04 Volume(体积)系统</strong></font>
类似于内置渲染管线的 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-defin…
<center><img width="600" src="http://imgtec.eetrend.com/files/2021-11/%E5%8D%9A%E5%AE%A2/100555425-22…; alt=""></center><center><font color="#9a9a9a"><em>图5:Render Pipeline Debug窗口中的Volume覆写堆栈</em></font></center><br>
这些代码写出来的默认属性可在 HDRP Default Settings 选项卡的 Volume Component 部分覆写。注意,这里的覆写依旧能被场景中的体积所覆盖。
而摄像机会反过来取场景各体积属性的混合值。如果体积属性不存在,摄像机就会取 HDRP Default Settings 下的属性值。否则,它就会取写入代码中的默认属性值。
如图 5 所示,Render Pipeline Debug 窗口的 Volume 面板可以很好地显示出 Volume 属性的覆写堆栈,以及当前启用中的体积属性,辅助图形调试。
<font style="line-height: 40px;" color="#c200ff"><strong>05 网格和表面</strong></font>
类似内置渲染管线,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
<font style="line-height: 40px;" color="#c200ff"><strong>06 光照</strong></font>
类似内置渲染管线,HDRP 的每盏灯都会被存储为 HDRP 特有的数据格式。管线除了常规 Light 组件外还会使用 HD Additional Light Data(HD 光照补充数据)组件,因为许多光照设置并非来自关联了 Light 组件的 Game Object 上。
下方为几个例子:
<ul><li>间接光照将受 Light Probe Groups(光照探针组)、Reflection Probes(反射探针,带有 HD Additional Reflection Data(HD 反射补充数据)组件)、Planar Reflection Probes(平面反射探针)及 Lighting Settings(光照设置)影响。光照本身也可以由 Indirect Lighting Controller(间接光照控制器)体积组件进行调整。</li>
<li>体积系统决定了天空的光照。</li>
<li>体积系统也还控制着相关的屏幕空间效果。这些效果类似于一个光源或阴影源:Screen Space Reflection(屏幕空间反射)、Screen Space Refraction(屏幕空间折射)、Screen Space Global Illumination(屏幕空间全局光照)、Screen Space Ambient Occlusion(屏幕空间环境遮蔽)及 Contact Shadow(接触阴影)。</li>
<li>Subsurface Scattering(次表面散射)模拟了“表面到表面的光照”。大多数次表面散射属性由 Diffusion Profiles(散射配置)设定,而后者又定义在了材质中。你可以在体积系统中用 Diffusion Profile Override(散射配置覆写)覆盖其属性。</li></ul>
<center><img width="600" src="http://imgtec.eetrend.com/files/2021-11/%E5%8D%9A%E5%AE%A2/100555425-22…; alt=""></center><center><font color="#9a9a9a"><em>图6:Indirect Lighting Controller(间接光照控制器)体积组件</em></font></center><br>
<font size="3" style="line-height: 45px;" color="#c200ff"><strong>属性搜索</strong></font>
在大致了解了 HDRP 的 UX 组成后,我们再来看些比较冷门的 HDRP 图形属性。图 7 展示的是一种从一般设置到覆写设置、“自上而下”的属性查找方法。可以看到,从上方的总体设置到下方的覆写设置,查找的范围在扩大。
<center><img width="600" src="http://imgtec.eetrend.com/files/2021-11/%E5%8D%9A%E5%AE%A2/100555425-22…; alt=""></center><center><font color="#9a9a9a"><em>图7:在HDRP项目中查找图形属性的一种可行流程</em></font></center><br>
<font size="3" style="line-height: 45px;" color="#c200ff"><strong>图形设置的多个维度</strong></font>
HDRP 的图形设置必须要应对以下几方面:
<ul><li>程序的图像质量等级,根据运行平台的不同而不同</li>
<li>当前活跃的摄像机</li>
<li>摄像机在场景中的位置</li>
<li>模型上使用的材质</li>
<li>照射在模型上的光照</li></ul>
并且,HDRP 的设置有几个不同的维度。
<font style="line-height: 40px;" color="#c200ff"><strong>01 多层设置间的冲突</strong></font>
下方列举出的设置之间往往会存在冲突:
<ul><li>质量等级和活跃中摄像机可能会试着控制同一个图形参数。举例来说,如果你想在低端设备上减少 Subsurface Scattering 的采样次数,最好也修改 Render Textures 摄像机的 Subsurface Scattering 采样次数,以达到画中画效果。</li>
<li>质量等级和摄像机位置可能会试着控制同一个图像参数。在 GPU 算力有限的平台上,部分场景的复杂光照效果已经占用了大量的处理时间,而在这些地方优化性能时,你可以尽量降低后处理效果的质量,节省一些性能预算。</li>
<li>质量等级和光照设置可能会试着控制同一个图像参数。在内存有限的平台上,如果你想通过降低阴影贴图的分辨率来优化性能,不要忘了场景中存在的小型聚光灯也需要使用低分辨率的阴影贴图。</li></ul>
为了解决这些冲突,高清渲染管线支持多级 设定。某个属性不只有一个值,而可以有几个等级的数值,比如低级、中级、 高级甚至终极。
<center><img width="600" src="http://imgtec.eetrend.com/files/2021-11/%E5%8D%9A%E5%AE%A2/100555425-22…; alt=""></center><center><img width="600" src="http://imgtec.eetrend.com/files/2021-11/%E5%8D%9A%E5%AE%A2/100555425-22…; alt=""></center><center><img width="600" src="http://imgtec.eetrend.com/files/2021-11/%E5%8D%9A%E5%AE%A2/100555425-22…; alt=""></center><center><font color="#9a9a9a"><em>图8:每个等级都有一个给定值</em></font></center><br>
在渲染画中画效果的摄像机上,你可以为后处理体积和接收阴影贴图的聚光灯设定一个等级:
<center><img width="600" src="http://imgtec.eetrend.com/files/2021-11/%E5%8D%9A%E5%AE%A2/100555425-22…; alt=""></center><center><img width="600" src="http://imgtec.eetrend.com/files/2021-11/%E5%8D%9A%E5%AE%A2/100555425-22…; alt=""></center><center><img width="600" src="http://imgtec.eetrend.com/files/2021-11/%E5%8D%9A%E5%AE%A2/100555425-22…; alt=""></center><center><font color="#9a9a9a"><em>图9:用等级来替代具体数值</em></font></center><br>
HDRP 这时就可在 HD Render Pipeline 设置资源中找到每种等级对应的属性值,管线便会使用该属性。
当然,摄像头、体积和光照也可以忽略分级设置系统,直接执行它们想要的行为。
<font style="line-height: 40px;" color="#c200ff"><strong>02 三种设置层次的重叠</strong></font>
我们再到另一个例子中看看重叠的设置层次。
在某个场景中有一些 Mesh Renderer,每个都带有 Shader Graph 编写而成的复杂顶点动画。对低端设备来说,顶点动画的性能开销过于高昂。而若想制作出画中画效果,你还需要用到另外一个摄像机,这个摄像机并不需要渲染顶点动画。
以下三层设定会互相重合:
<ul><li>场景模型上的材质</li>
<li>程序的质量等级</li>
<li>场景中的摄像机</li></ul>
为了解决这种情况,Shader Graph 设有一个特殊的 Material Quality(材质质量):
<center><img width="600" src="http://imgtec.eetrend.com/files/2021-11/%E5%8D%9A%E5%AE%A2/100555425-22…; alt=""></center><center><font color="#9a9a9a"><em>图10:Shader Graph中的Material Quality</em></font></center><br>
与用户为每个材质设置的普通 Shader Graph 节点不同,Material Quality 是一个全局节点,存在于 HDRP 之内。在 HD Render Pipeline 设置资源中,你可以在 Material Quality 预设的几种等级中选择、设置默认的等级。
<center><img width="600" src="http://imgtec.eetrend.com/files/2021-11/%E5%8D%9A%E5%AE%A2/100555425-22…; alt=""></center><center><font color="#9a9a9a"><em>图11:Default Material Quality Level中预设的几种质量等级</em></font></center><br>
你可以在每个摄像机上修改默认帧设置、设定材质质量等级,覆盖 HDRP 配置文件的设置。
<center><img width="600" src="http://imgtec.eetrend.com/files/2021-11/%E5%8D%9A%E5%AE%A2/100555425-22…; alt=""></center><center><font color="#9a9a9a"><em>图12:在摄像机的Frame Settings(帧设置)中设定新的材质质量等级</em></font></center><br>
HDRP 有一个系统性的设置流程可让美术人员也能轻松驾驭,我们认为良好的用户体验是刺激高质量内容创作的关键之一。
关于优化 HDRP 设置的详细内容,欢迎跳转 Unity 社区学习:
https://developer.unity.cn/projects/6189ca70edbc2a05bb60b145