目录
一、HDRP入门
1.HDRP设置
1.1 HDRP配置文件中的全部设置项
1.1.1 Rendering下的Lit Shader Mode
1.1.2 Lighting 下的Volumetrics(体积光)和Screen Space Reflection(屏幕空间反射)
2.离线渲染VS实时渲染
3.Volume组件
3.1Sky and Fog Volume 天空&雾效
4.光照贴图烘焙
5.HDRP材质和着色器
5.1 Mesh
5.2 Material
5.3 Shader
5.4 Texture
5.4.1 Surface Options
5.4.2 Surface Inputs
二、RenderPipeline相关菜单
1.HDRP Wizard窗口
2.LookDev
3.Rendering Debugger
三、HDRP基于物理的渲染
四、总结
首先HDRP是面向高端硬件的,它是集成了各种最先进渲染技术的解决方案。因此它的最佳应用场景是PC、主机平台AAA游戏,或者云游戏。(Unity版本为2022.1.2)
一、HDRP入门
自Unity 2018版本开始,Unity在原先的标准渲染管线(Built-in Render Pipeline)基础上增加了可编程渲染管线(Scriptable Render Pipeline,SRP)
在SRP发布之前,所有平台都是通过同一个标准渲染管线来做渲染输出。虽然使用非常方便(无须选择适配渲染管线),但是标准渲染管线对于开发者而言就像一个黑盒子,里面的渲染逻辑完全不可知。开发者也无法通过代码去控制整个渲染的流程,无法选择需要渲染的内容。随着SRP的发布,开发者可以通过C#代码直接指定渲染内容和控制渲染流程,也可以为自己的游戏或者应用定制独特的渲染管线。
为了帮助内容创作者尽快使用上SRP,Unity提供了两个在创建项目时就可以选择的模板:高清渲染管线(High Definition Render Pipeline,HDRP)和通用渲染管线(Universal Render Pipeline,URP)。HDRP目前可用于制作基于PC、Xbox One(或更新)和PlayStation 4(或更新)平台的游戏或者应用,也支持输出高端VR应用;URP则可用于所有平台(包括HDRP支持的所有平台)的游戏和应用开发。HDRP对于高端移动平台的支持目前正在研发之中。
1.HDRP设置
HDRP的全称是High Definition Render Pipeline(高清渲染管线)。它是基于Scriptable Render Pipeline(简称SRP,中文翻译为“可编程渲染管线”)实现的一个模板。
在设置渲染管线时我们要用到Project Settings(项目设置)界面,所以先通过菜单Edit→Project Settings… 打开项目设置界面。可以把渲染管线的设置分成以下几种情况。
- 使用默认的内置渲染管线:如果在项目设置界面中将Graphics的Scriptable Render Pipeline Settings参数设置为None,那么Unity使用的就是内置渲染管线。
- 使用HDRP:要将渲染管线设置为HDRP,需要给Scriptable Render Pipeline Settings关联一个HDRP配置文件(在Project窗口中)
可以创建多个拥有不同配置信息的HDRP配置文件,然后在不同的平台上使用它们。比如为PC、Xbox One和PlayStation 4分别创建对应的HDRP配置文件,然后在构建不同平台的应用时,手动关联相应的HDRP配置文件。当然也可以通过脚本来动态判断和设置,所需脚本API为GraphicsSettings.renderPipelineAsset。 - 使用URP(Universal Render Pipeline,中文翻译为“通用渲染管线”)
1.1 HDRP配置文件中的全部设置项
注意:我们之前在Edit→Project Settings中的Graphics的Scriptable Render Pipeline Settings参数设置为HDRenderPipelineAsset。但在Quality中有多个levels,每个level对应的Render Pipeline Asset不同,默认是High Fidelity level,对应的Render Pipeline Asset为HDRP High Fidelity,那么该项目起作用的Render Pipeline Asset为HDRP High Fidelity,而不是HDRenderPipelineAsset。unity对这两个设置的解释如下:
- Graphics中Scriptable Render Pipeline Settings:This defined the default render pipeline,which Unity uses when there is no override for a given quality level.
- Quality中Render Pipeline Asset:Specifies the Render Pipeline Asset to use for this quality level.It overrides the value set in the Graphics Setting Window.
HDRP的设置信息分为以下几个部分:
- Rendering(渲染)
- Lighting(光照)
- Lighting Quality Settings(光照质量设置)
- Material(材质)
- Post-processing(后处理)
- Post-processing Quality Settings(后处理质量设置)
- XR(XR相关设置)
- Virtual Texturing(虚拟纹理)
1.1.1 Rendering下的Lit Shader Mode
控制Lit Shader使用的渲染模式,其下有Forward Only、Deferred Only和Both三种模式。
- Forward模式可以提供更多的高级材质,但是相应的性能消耗较大(比如使用的内存通常较大)。
- 如果选择Both模式,那么HDRP会预先生成针对Forward和Deferred两种模式的Lit Shader variants(Lit着色器变体),这样就可以在运行时(Runtime)中针对不同的相机在这两种模式间切换。当然,如果选择Both,内存的占用将会变大,因为内存中包含了更多的Lit着色器变体。
1.1.2 Lighting 下的Volumetrics(体积光)和Screen Space Reflection(屏幕空间反射)
如果在Render Pipeline Asset配置文件中勾选了Volumetrics选项,那么在Sky and Fog Volume的Fog中的Volumetric Fog配置就会生效。如果关闭了Screen Space Reflection选项,即使Sky and Fog Volume添加了Screen Space Reflection这个Volume Override,该界面也会提醒此功能不可用。(由此可见,HDRP配置文件在HDRP项目中所处的中心地位,以及它与单独的Volume组件之间的父子关系)
2.离线渲染VS实时渲染
所谓DCC,就是Digital Content Creation的缩写,即数字内容创作。DCC的范围包括二维/三维、音频/视频剪辑合成、动态/互动内容创作、图像编辑等。通常传统DCC软件的离线渲染器:画质好、耗时长。渲染一帧画面(也就是一张图片)所需的时间,按照场景的复杂度和所用电脑的运算能力,从几秒到几十小时甚至上百小时不等。
使用实时渲染引擎:画质没离线渲染强、耗时短。可以在Unity编辑器中以每秒几十帧甚至上百帧的速度渲染画面。
虽然在实时渲染引擎中获得的画面质量,还无法与离线渲染的画质相提并论,但是两者之间的差距正在迅速缩小。使用实时渲染引擎可以在Unity编辑器中以每秒几十帧甚至上百帧的速度渲染画面。随着Unity工具链的不断发展,Unity本身也开始逐渐具备传统DCC工具的部分功能。
3.Volume组件
通过HDRP项目模板来创建项目,Unity会为我们自动设置好所有的HDRP高清渲染管线资源,建议保留项目窗口中的HDRPDefaultResources、Presets和Settings三个文件夹,否则需要手动生成HDRP渲染管线相关的配置文件。
HDRP使用Volume框架将天空的光照、阴影、后处理等设置集中到了一起。在示例场景中有一个Volume:Sky and Fog Volume负责天空、雾效效果。
Volume组件:Volume框架其实就是一个组件,它和Camera组件本质上是一样的,因为两者都可以被添加到GameObject中,为其添加功能。
场景中可以有多个Volume组件,例如Sky and Fog Volume和Post Process Volume,当然把这两个Volume合二为一,也就是只需要一个Volume关联一个Profile。不过如果合二为一的话,一方面Volume组件上的列表会变得很长,不利于后期维护。另一方面如果我们使用多个Local(本地)的后处理Volume,那么就无法灵活处理它们了。将具有不同功能的Volume进行合理的区分,将它们关联到不同的Profile,有助于后期维护和功能管理。
3.1Sky and Fog Volume 天空&雾效
Sky and Fog Volume提供基于HDRI的光照,控制曝光度、雾效等。
● Mode(模式)
可以将Volume设置为Global(全局)模式或者Local(本地)模式:
- 如果设置为全局模式,则Volume上的效果默认会影响整个场景。
- 设置为本地模式,则可以为其指定不同形状的碰撞体,比如Box、Sphere等。
设置为本地模式时,Volume上的效果只会在相机与Volume上的碰撞体发生碰撞时被触发。例如,如果场景中有多个房间,每个房间的朝向是不一样的,则可以为每个房间设置一个本地模式的Volume,比如朝北房间是偏冷色调,朝南房间因为有阳光照射进来可以设置为偏暖色调。当场景中的相机进入北房间时,相机与此房间中Volume上的碰撞体发生碰撞,从而触发偏冷色调的本地Volume,所以整个画面看上去就是冷色调。进入南房间时则用相同的机制触发偏暖色调的本地Volume,此时整个画面过渡变化为暖色调。
● Profile(配置文件)
使用Volume框架的一个好处是可以把组件和具体的设置进行分离。Volume组件上的所有设置其实来自于关联的Profile。在开始设置之前,需要先创建一个新的Volume Profile或者关联一个已经存在的Profile。Profile是一个用Unity资源格式保存到本地磁盘上的文件,这也意味着我们可以使用别人已经创建好的Profile,或者将自己的Profile分享给别人使用(要确保大家使用的Unity版本是互相兼容的)。
● Visual Environment
主要用于选择天空盒的格式。可以选择:
- None(不使用天空盒,不会有来自天空盒的环境光)
- Gradient Sky(使用渐变色程序化生成的简单天空盒)
- HDRI Sky(从关联的HDRI高动态图片采样获得天空盒的光照信息)
- Physically Based Sky(基于物理的程序化生成的天空盒,可以用于模拟日夜变换、大气层厚度等复杂天空效果)。
● Physically Based Sky
如下图所示,因为选择的Visual Environment类型是Physically Based Sky,所以要为Volume指定一个Physically Based Sky。
● Fog
在这里可以控制场景中雾气的浓度、离地面的高度,也可以设置距离远近。还可以配合使用灯光组件的Volumetrics(体积光)属性创造体积光效果。
● Add Override
在Volume组件中,我们可以通过该按钮为当前Volume添加以下各个大类的配置信息,并通过Volume组件对这些效果进行调整。
4.光照贴图烘焙
与传统的离线渲染不同,实时渲染要求以每秒几十帧的速度生成画面,因此我们需要使用很多方法来减少各方面的计算量。要让整个场景看起来真实,需要为其生成全局光照信息(Global Illumination)。但是按照目前的算法和设备的算力,实时生成全局光照信息还不现实。(当然,目前最先进的实时光线追踪(Realtime Raytracing)功能已经可以使用高端显卡实现,比如Nvidia公司的RTX系列显卡)。不过对于大多数设备来说,还是需要使用像光照贴图烘焙(Lightmapping)这样的技术来预计算全局光照信息,将计算好的光照信息保存到光照贴图(Lightmap)上,然后在实时渲染时将它们应用到场景中,来实现全局光照的效果。
5.HDRP材质和着色器
要渲染某个模型,需要将Mesh、Material、Shader和Texture组合在一起才行:
5.1 Mesh
Mesh代表的是模型本身,用于表现形状。
5.2 Material
一个Mesh可以关联多个Material,用于控制模型不同部分的材质表现。比如我们的模型上有塑料的部分,也有金属的部分。只用一种材质来表现这两种完全不同的材料的表面是不可能的,因此需要使用两种材质来表现塑料和金属这两种表面。
5.3 Shader
每种Material都与一个指定的Shader相关联。Shader是一段代码,包含了用于计算屏幕上每个像素点颜色的具体算法。Shader进行计算的时候会考虑当前场景的光照信息以及在Material上提供的具体配置信息。
在HDRP中常用的一个Shader是Lit Shader。Lit Shader可以模拟非常多的材质表面,比如金属、玻璃、木材等。
5.4 Texture
在Surface Inputs参数集合中可以指定各种Map。这些Map所关联的就是Texture(通过Photoshop、Substance Painter等工具生成的Bitmap图片),其用于为模型添加各种细节。
5.4.1 Surface Options
Surface Type(表面类型)
它有两个选项:Opaque(不透明的)和Transparent(透明的)。这是一个基本选项,在设置其他参数之前,你首先要决定你的物体是不是透明的。
Material Type(材质类型)
不管选择哪种表面类型,都会显示6种材质类型:Subsurface Scattering(次表面散射)、Standard(标准)、Anisotropy(各向异性)、Iridescence(彩虹色)、Specular Color(高光颜色)和Translucent(半透明)。默认选择的是Standard材质类型。
可以根据物体表面的特性来选择不同的材质类型。以下列出了部分可应用上述6种材质类型的物体。
材质类型 | 应用 |
---|---|
Subsurface Scattering(次表面散射) | 用于模拟光线与半透明物体交互时产生的现象,俗称SSS。光线进入物体以后,有部分会发生散射并模糊,然后再次返回物体外面(出射角度与入射角度不同)。可用于模拟皮肤、树叶、蜡烛、玉器及瓷器釉面等。 |
Standard(标准) | 可用于表现大部分材质,属于PBR材质制作流程中的Metallic Workflow。此工作流把物体分为金属和非金属两类。 |
Anisotropy(各向异性) | 各向异性材质适用于模拟拉丝金属表面或者天鹅绒。这类材质表面,从不同的角度看过去,会出现不同的高光现象。 |
Iridescence(彩虹色) | 彩虹色材质的特性是,当你的观察角度或者光照角度变化时,物体表面的颜色会发生渐变(渐变色)。这非常适合用于模拟肥皂泡、彩虹色金属表面和昆虫的翅膀等。 |
Specular Color(高光颜色) | 可用于表现大部分材质,属于PBR材质制作流程中的Specular Workflow。此工作流类似内置渲染管线中的Standard (Specular setup)。 |
Translucent(半透明) | 半透明材质可以和一张Thickness Map配合使用,用于模拟半透明物体。它和次表面散射材质的区别是,出射光线在射出物体之前不会变模糊。 |
5.4.2 Surface Inputs
- Base Map:用于为模型提供Albedo颜色信息。
- Mask Map:通过使用一张将信息储存到RGBA四个通道中的纹理,来一并控制Metallic(金属反光-Red通道)、Ambient Occlusion(环境光遮蔽-Green通道)、Detail Mask(细节遮罩-Blue通道)和Smoothness(光滑度-Alpha通道)。使用一张纹理控制四种属性可以降低内存的占用。
- Normal Map:法线贴图用于为模型表面添加更多模型上不存在的细节。
二、RenderPipeline相关菜单
1.HDRP Wizard窗口
通过Wizard窗口,我们可以快速检查当前项目是否拥有HDRP项目所要求的设置。在此窗口中最主要的是HDRP、HDRP+VR和HDRP+DXR这三个分区。
- HDRP分区:普通HDRP项目默认使用该快速配置检查列表。如果这里有一项没有通过检查,则界面上会出现Fix按钮,你可以针对每一项单独修复,也可以一键修复所有检查项。
- HDRP+VR分区:适用于针对HDRP VR项目的配置检查。
- HDRP+DXR分区:适用于针对HDRP光线追踪项目的配置检查。
2.LookDev
通过Look Dev窗口,我们可以将模型置于多个HDRI环境下,以便进行快速查看和效果比较。
3.Rendering Debugger
Debug窗口的作用是,我们通过调整这里不同的参数,可在Game窗口或者Scene窗口实时查看相关的信息。
举个例子:如果修改Material→Common Material Property为Albedo(反照率贴图),则在Game窗口中可以看到模型上只加载Albedo的效果;如果为Normal(法线贴图),则在Game窗口中可以看到模型上只加载Normal(法线贴图)的效果。
三、HDRP基于物理的渲染
基于物理的意思是,我们把现实世界中灯光和材质的一些本质信息用计算机图形学表达出来。比如用真实世界中的光照单位来模拟灯光的亮度,模拟真实世界光线的反射和折射从而实现全局光照的效果;用真实世界中物体表面对光的反应对不同材质的属性进行模拟,比如金属材质的反射、玻璃材质的反射和折射、皮肤和树叶的次表面散射、肥皂泡的彩虹色,以及汽车油漆外面包裹的清漆等。
当然,因为实时渲染要求至少每秒30帧的画面输出,所以我们还无法完整地模拟真实世界的各种效果。但是随着计算机算力的进一步提升,包括CPU、GPU、存储、带宽等的提升,我们会逐步将这些模拟提升到接近真实世界的水平。
四、总结
一个HDRP场景中除了包含模型外,还需要包含相机、灯光、光照探针、反射探针。然后最重要的是,使用Volume控制整个场景的光照和后处理效果。也需要使用光照贴图烘焙技术来为场景添加全局光照明。