Unity-HDRP-Sense-10
HDRP配置文件和Volume框架详解
3.3 Volume框架详解
Volume框架时HDRP最重要的组成部分之一。Volume框架的作用总结如下:
-
为场景设置来自天空盒的环境光照
-
设置各种阴影效果,包括场景中的Contact Shadow 和 Micro Shadow。
-
设置场景中的雾效
-
设置基于屏幕空间的反射和折射(Screen Space Reflection 和 Screen Space Refraction)、环境光遮蔽(Ambient Occlusion)。
-
设置后处理效果(Post-processing)
-
设置实时光线追踪(Ray Tracing)。
使用Volume框架的方法就是把Volume组件添加到场景中的一个空GameObject上,然后在其上添加各种所需的Override(覆盖),比如Visual Environment、HDRI Sky 和 Fog等。当然你也可以把Volume组件添加到任何GameObject上,但是为了组织结构清晰,建议添加到空的GameObject上,并使用有意义的名称,比如Scene Settings、Post Processing等。
在同一个场景中可以添加多个带Volume组件的GameObject,每个Volume的模式可以按照需要设置成Global(全局)或者Local(本地)。
Global模式(如图3.37所示)意味着这个Volume时针对整个场景生效。不管相机朝向哪里,Global模式的Volume都会被计算在内。
Local模式(如图3.38所示)的Volume则只在他的碰撞体(Collider)作用区域生效。选则Local模式后,界面上会出现Add Collider按钮,你可以单机该按钮为当前的Volume添加一个碰撞体。一般我们使用性能最好的Box Collider。当然,如果有特殊需求也可以使用其他类型的碰撞体。
要让Volume组件生效,需要为它添加一个Profile(配置文件)(如图3.39所示) 。Profile的本质是一个Scriptable Object,它本身并没有任何特殊功能,只是一个用来保存配置数据的地方。值得注意的是,在菜单Edit->Project Settings->HDRP Default Settings中已经包含了一个默认的Volume Profile。如果你没有在场景中设置任何Volume,那么这个默认的Volume就会起作用。因此,在场景中添加Volume的各项属性就是Override(重载)。例如,默认的Volume Profile中已经包含Shadows(阴影)设置,这时如果在场景中的Volume中选择Shadow作为Override,那么当前场景将不再使用默认Volume Profile中的Shadows设置。
在运行时,HDRP会遍历当前场景中所有处于激活状态的Volume,决定每个Volume对当前场景的贡献,然后使用当前相机的位置信息来计算Volume中各项重载 (Override)对最终的画面的贡献。下面我们来详细了解一下主要的Volume重载。
单击Volume组件中的Add Override按钮,如图3.40所示,我们可以看到目前的Volume重载 ,被分成了9类(这个并不是固定不变的,随着H0DRP版本的升级,里面的内容越来越丰富)
接下来我们使用项目来说明这些Volume重载。(如果你还没有下载实例场景工程,请使用在第一章中提供的工程下载地址链接下载。)如果你要通过操作来学习,请先通过Unity Hub打开Sponza_HDRP工程。
注:这里不会按照上述列表的顺序来分别说明这些重载的用途,因为很多重载时相互关联的,比如Visual Environment 和Sky。
3.3.1 Exposure (曝光控制)
因为HDRP时完全基于物理的渲染系统 ,所有的灯光设置和材质设置都是基于物理的,所以要想正常显示场景画面,就必须为场景设置正确的曝光。这也是为什么把曝光控制放在最前面介绍的原因。
如果一个Volume被添加了Exposure重载,那么所有当前Volume影响的相机都会使用这个Exposure重载,受它的影响。这个曝光影响的是在当前Camera窗口显示的最终效果。
曝光值的是相机感光元器件接受的光线强度。曝光的数值越高,相机接受的光纤强度越大。
1.曝光参数说明
Volume中的Exposure重载包含四种模式:Fixed 、Automatic、Curve Mapping 和 Use Physical Camera。四种模式的应用场景如下。
(1)Fixed(固定曝光)
使用固定数值来控制曝光,该模式可应用于曝光变化不大的场景,也就是场景中的各个区域类似的曝光强度。
我们也可以使用多个被设置为Local(本地)模式的Volume, 通过Blend Distance(混合距离)来融合切换不同Volume的曝光。比如一个场景由两部分组成:一部分是灯光昏暗的室内场景;另一部分是明亮的室外场景。在真实世界中,当我们从室外进入到室内时,我们的眼睛会自然地适应曝光的变化。在虚拟场景中,我们可以为室外部分和室内部分设置两个本地模式的Volume,并为他们设置不同的曝光,在添加合理的Blend Distance来模拟真是世界的曝光变化(当然,也可以用自动曝光来控制曝光的变化)。
不过,现在大家心中肯定有一个疑问:“我怎么知道不同场景正确的曝光值呢?”
答案是,因为HDRP的光照系统是完全基于物理的,所以我们可以参考物理世界真是的曝光。图3.41 列出了典型的曝光区间参考值(单位为EV100)。
(从左到右分别表示的是:夜晚、带人工照明的夜晚、室内光照、太阳下山、多云、太阳当空)
-
full sunlight:大太阳的天气(曝光:15)
-
partly cloudy:少云的天气(曝光:14)
-
cloudy: 多云的天气(曝光:13)
-
deep shade:树荫,遮蔽的地方(曝光:12)
-
twilight:黄昏时分(曝光:10)
-
home interior:屋内场景(曝光:6)
-
candlelight: 依靠烛光照亮(曝光:4)
-
moonlit night:月光照亮的夜晚(曝光:-3)
不同光照条件下的曝光参考值(单位为EV100)如表3.1所示(来源:https://en.wikipedia.org/wiki/Exposure_value)
光照条件 | EV100 |
---|---|
在完全或者轻微朦胧的日光条件下的浮沙天气或者小雪天气(能产生明显的阴影) | 16 |
在完全或者轻微朦胧的日光条件下的场景 | 15 |
在朦胧日光条件下的场景(能产生软阴影) | 14 |
阴郁沉重的天气 | 12 |
清晰阳光下的阴影下的开放区域 | 12 |
户外自然曝光参考值(单位为EV100)如表3.2所示(来源:https://en.wikipedia.org/wiki/Exposure_value)
户外自然曝光 | EV100 |
---|---|
彩虹 | |
晴朗的天空作为背景 | 15 |
多云的天空作为背景 | 14 |
落日和天际轮廓线 | |
太阳即将下山之前 | 12~14 |
太阳下山时 | 12 |
太阳刚刚下山 | |
月球,海拔>40度 | |
满月 | 15 |
凸月 | 14 |
弦月 | 13 |
新月 | 12 |
血月 | 12 |
月光,月球海拔>40度 | -3~-2 |
满月 | -3~-2 |
凸月 | -4 |
弦月 | -6 |
户外人工光源曝光参考值(单位为EV100)如图3.3所示(来源:https://en.wikipedia.org/wiki/Exposure_value)
户外自然光 | |
---|---|
霓虹灯和其他明亮的标志牌 | 9~10 |
夜间运动照明 | 9 |
火焰和着火的建筑物 | 9 |
明亮的街道 | 8 |
夜间街景和展示的橱窗 | 7~8 |
夜间车辆交通 | 5 |
市集和游乐场 | 7 |
户外圣诞树发出的亮光 | 4~5 |
泛光照明的建筑物、纪念碑和喷泉 | 3~5 |
远处有灯光的建筑物 | 2 |
室内人工光源曝光参考值(单位为EV100)如表3.4所示(来源:https://en.wikipedia.org/wiki/Exposure_value)
室内人工光源 | |
---|---|
美术馆 | 8~11 |
体育赛事,舞台表演等 | 8~9 |
马戏团照明 | 8 |
冰灯照明 | 9 |
办公室场景 | 7~8 |
室内装修 | 5~7 |
室内圣诞树发出的亮光 | 4~5 |
在Volume的Visual Environment重载中,三种Sky(天空盒)类型都有自己的曝光控制,天空盒子曝光控制除了可以参考前面表格中的书之外,也可参考HDRP文档中提供的参考值。如表3.5所示
照明度(Lux) | 自然光照等级 |
---|---|
120000 | 非常明亮的阳光 |
110000 | 明亮的阳光 |
20000 | 中午的蓝天 |
1000~2000 | 阴天中午的天空 |
< 1 | 月光明亮,无云的天空 |
0.002 | 没有月光,有辉光和星光 |
(2)Automatic(自动曝光)
根据当前相机的威望值信息和相关场景信息来自动调节场景曝光。非常使用与曝光随位置不同而发生变化的场景,比如从光照强烈的户外进入以南的室内或者从山东中移动到山洞外。
在上述两种情况中,场景的曝光会发生很大变化,如果选用自动曝光,就可以模拟显示中人眼适应不同曝光的情况。例如从明亮的户外进入以南的室内时,我们的眼睛会从很明亮的光照条件中逐渐过渡到以南的室内光照条件中。
(3)Curve Mapping(曲线控制曝光)
通过曲线来控制场景的曝光。X轴代表目前场景的曝光,Y轴代表我们想要的曝光。曲线控制的方式一般留给业内专家使用。
(4)Use Physical Camera(物理相机控制曝光)
物理相机的各项属性在Camera组件中。如果需按照此选项,则Volume界面中只剩下Compensation(补偿)这一项(如果你相对当前Volume所影响画面做过度曝光或者曝光不足的处理,可以使用这一参数)。
通过物理相机的ISO、Shutter Speed和Aperture参数来控制曝光,如图3.43所示。
使用物理相机的好处是,如果你对真实世界的各种相机参数很熟悉,就可以利用已有的知识来精确控制画面的曝光。具体如何设置和物理相机的各项参数,可以参考图3.44所示的曝光三角图。
可以使用如图3.45所示的公式化来计算具体的EV100曝光值。
如果我们想参考某种光照环境下的曝光值,可以拍一张照片(或者参考类似的照片)后获取 拍照这张照片是所用的Iso、Shutter Speed和Aperture数值,再通过上述公式来获得以上的曝光值,然后应用到我们的HDRP场景中。
-
Exposure示例说明
下面我们通过Sponza_HDRP这个项目中的两个场景来说明曝光的使用。
第一个场景是中午时分,蓝天白云的晴朗天气(对应的是Sponza_Day场景),最终效果如图3.46所示。
第二个场景是满月带雾的夜晚(对应的是Sponza_Night场景),最终效果如图3.47所示。
我们来看一下第一个中午时分的场景,在Hierachy中找到Scene Settings Volume,当前的环境、天空和曝光设置如图3.48所示。
在这个Volume中添加三个Override:Visual Environment、HDRI Sky和Exposure。
(1)Visual Evironment(环境设置)
用于控制整个场景所用的而天空盒,以及此天空盒和整个环境光照的影响。可以在Sky的Type(类型)中选择None、Gradient Sky、HDRI Sky和Physically Base Sky 四种天空类型。
-
None:此Volume不会渲染天空盒。
-
Gradient Sky: 将渲染的天空分成高、中和低三层,你可以为这三层分别制定一个颜色。
-
HDRI Sky:使用一个Cubemap(立方体贴图)来渲染整个天空。
-
Physicall Based Sky: 用于模拟一个球状星球的天空。天空的大气层会有两个部分。随着海拔高度的降低,大气层的空气密度会以指数级的速度降低。
-
Ambient Mode:可以选择Static和Dynamic两种模式。
Static(静态模式)
在静态模式下,整个场景的环境光来自烘培所得的Sky环境光。可以使用Lighting窗口中的Static Lighting Sky属性设置环境光(Lighting窗口用于设置光照烘培,后面章节会详细讲解),如图3.49所示。Dynamic(动态模式)
在动态模式下 整个场景的环境光来自Visual Environment中设置的Sky环境光,比如图3.49中所示的HDRI Sky或者其他天空类型。这让我们可以动态的改变当前的场景中的环境光。下面举例说明动态模式的使用方法。
-
可以为场景设置几个模式为Global(全局) 的 Volume,不同的Volume包含不同的Visual Environment和Sky类型,然后可以通过激活和禁用这些Volume来控制作为渲染当前场景的环境光。
-
也可以场景创建几个模式为Local(本地)的volume,不同的Volume包含不同的Visual Environment和Sky类型,然后将这些Volume放到场景中不同的区域,当相机进入这些本地Volume的时候,会启用当前的Volume,从而改变当前场景的环境光
-
(2)HDRI Sky(HDRI 天空)
因为在Visual Environment中将Sky设置为HDRI类型,所以需要添加HDRI Sky这个重载并进行具体设置,如图3.50所示。
-
Hdri Sky:指定一张用与渲染天空的Cubemap(使用HDRI贴图在Unity中转换而成,你可以在Unity资源上点中找到免费/收费的HDRI贴图资源, 也可以通过类似的hdrihaven.com 这样的网站免费下载)。可以导入HDRI 贴图并将其转换成可用的Cubemap用于天空的渲染,具体步骤如下。
步骤1:获得一张二维的HDRI贴图
步骤2:将其导入Unity项目中,并在Project窗口选中它。
步骤3:在Inspector窗口中按照图3.51所示进行设置。- 将Texture Shape设置为Cube。
- 选择一个Max Size,这里选择4096×4096(4K)的尺寸。你也可以选择更小的尺寸,比如2048×2048(2k)或者1024×1024(1k)。更小的尺寸可以减小文件的大小,从而减少GPU上的压力和所需使用的显存,但是质量可能有所损失。
- (可选)选择Compression(压缩)设置,压缩文件。
步骤4:单击Apply按钮完成转换。
-
Intensity Mode(光照强度模式):用于控制来自天空的环境光照度,有如下三种模式可选:
- Exposure,使用单位为EV100 的数值来计算天空的亮度(可参考之前 提供的Wikipedia上的曝光数值)。
- Multipler,使用一个固定的成熟来控制天空的亮度。
- Lux,使用单位为Lux的数值来计算天空的亮度( 可参考HDRP官方文档的中提供关于自然光的数值)
-
Rotation(旋转HDRI贴图) :拖动滑块可以旋转Cubemap从而改变当前相机可视范围内的天空显示。
-
Update Mode(更新模式):有三种更新模式可选择。
-
On Changed,当一个或者多个天空相关的 参数发生变化时更新。
-
On Demand,只通过脚本中 API触发才更新。
-
Realtime,按照在Update Period中指定的间隔时间自动更新。
-
(3)Exposure(屏幕曝光)
在设置好Sky以后,需要通过控制Exposure重载来调整当前相机所看到的整个画面,图3.52所示是针对最终看到的画面所作的曝光控制。
之所以将Exposure的Mode(模式)设置Automatic,主要原因是当前场景属于一个半开方式的场景。它既有处于屋顶下的部分,也有中间开放式的区域。如果在这样的场景中使用固定的曝光值。当角色在场景中游走时,就会遇到曝光过度或者曝光不足的情况。因此当场景适用自动曝光。
下面我们一起来了解一下 自动模式下的各项参数。
-
Metering Mode:用于控制如何采样用于曝光的计算场景中的灯光,有三种模式可选择:
- Average,针对整个画面进行采样,计算结果很稳定。
- Spot,只针对画面中央的区域进行采样,计算结果不太稳定。如果画面中央的采样区域较暗,则整个画面可能曝光过度;反之则可能曝光不足。
- Center Weighted,取两个的优点。相机会为画面中的每个像素添加一个权重,最中心的像素权重最大,离开中心越远的像素权重越小。最后按照每个像素的权重对曝光进行计算。
-
Luminance Source:在此选择用于计算场景曝光的缓冲数据 ,默认使用Color Buffer。
-
Compensation:类似于很多相机上的设置,用于对通过自动计算获得的曝光进行补偿。如果你想获得曝光过度或者曝光不足的效果,可以使用参数控制。 通常情况下设置为0。
-
Limit Min 和Limit Max:分别用于控制场景自动曝光的最小值和最大值。可以用这两个分别调节当相机处于场景的暗部和亮部时整体的曝光。
- 当前画面靠近场景中的亮部,比如 一盏灯时,周围的环境会变暗,这可能导致画面暗部曝光不足(场景中有很明亮的月光作为环境光,所以看上去不应该那么暗)。这是可以将Limit Max数值调低,以提升 整个画面的曝光,如图3.53所示(夜场景)
-
-
-
如果画面处于场景的暗部,比如在黑暗的脚落朝外看,那么外部环境会变量,这可能导致画面领部曝光过度(月光即是很亮也不应该像白天)。这时可以将 Limit 数值调高。来降低整个画面的曝光,如图3.54所示(夜晚场景)
-
-
Adaptation(适应):用于控制画面在敏感之间变化过程中,也就是说从黑暗到光照 或者 从光明到黑暗的转变工程中画面的曝光的变化速度。可以有如下选择
- Fixed(固定的),HDRP固定的方式,无需输入任何参数。
- Progressive(渐变的),可以设置Speed Dark to Light (从黑暗到光明的变化速度)和Speed Light to Dark (从光明到黑暗的变化速度)的值。参数值越大,曝光的变化速度越快。