Volume框架详解
首先我们需要先了解Volume框架的作用:
主要功能在于看i为场景设置环境光照,各种阴影效果,雾效,屏幕空间折射和反射,后处理效果,实时光线最终
使用Volume的方法就是在场景中创建一个空物体,然后讲Volume组件添加到空物体上然后点击AddOverride添加各种功能的重载
通过这种方式来调整指定范围内的渲染信息
Mode
这个设置有两个选项,分别是Global(全局)和Local(局部)
看名字就可以理解,意思是这个Volume组件的效果是作用于局部还是全局
如果选择Global的话那么这个Volume的效果就会作用余这个场景的所有地方
如果先择Local的话那么这个Volume组件的效果就会作用于它指定的碰撞体范围内,将选项选择为Local后界面上会出现AddCollider选项,这个选项会为空物体添加一个碰撞体,在碰撞体内的相机才会受到这个Volume的影响
BlendDistance
首先我们要知道,局部Volume碰撞体内相机显示的画面和碰撞体外的画面质感完全不一样(毕竟是经过额外渲染的),但是有时候我们需要将室内和室外这种场景的渲染设置的不相同,比如室内暗一些,室外亮一些,室内和室外不能使用相同的Volume去渲染,那么我们就需要在室内和室外分别方式两个局部Volume来设置他,但是如果直接这么设置的话相机从室内到室外进出碰撞体的一瞬间画面质感会发生很大的变化,要知道现实中从室内到室外也有一点曝光逐渐增多的的路段,不会显得就像一盏灯突然打到你的脸上那么突兀,那么这就需要在两个不同 Volume之间添加一段过度距离,BiendDistanc是以米为计量单位的,他的作用就是在距离当前设置的Volume碰撞体多少米时开始过度,他会检测自身Volume的数值相比于外部的Volume数值相差多少,然后在过渡范围内逐渐递增或者递减(前面说过如果有地区没有使用Volume的话就会默认使用系统设置好的,所以过度始终时相当于两个Volume的过度)
想要使用Volume就必须为他的Profile位置添加一个配置文件,要么将已经配置好的文件拖进去,要么点击New创建一个新的,这个配置文件的主要作用是用于存储配置数据
这里提一点,前面我们说到为Volume添加功能是各种功能的重载,那么既然是重载那肯定就有原本的功能设置,在如果一个场景没有添加任何的Volume的话他是会有一个默认的Volume生效的,所以后面添加修改的功能都属于原本Volume的重载
Edit→Project Settings→HDRPDefault Settings中已经包含了一个默认的Volume Profile
接下来我们来具体说一下这些方法重载的功能
Exposure(曝光控制)
HDRP渲染是基于物理的渲染,所以里面的灯光设置和材质都要基于物理,想要做出真实的效果一定要控制好曝光
Volume添加了Exposure后所有在范围内被Volume所影响的相机曝光都会受到他的影响,曝光是指相机接收光线的强度,曝光越高感光器件接收的光线强度越大
下面介绍曝光控制的几大模式(Mode)
Fixed(固定曝光):
通过数值控制想要的曝光值,可以运用于曝光变化不大的场景,也可以在室内和室外创建两个局部Volume然后公告BlendDistance来控制过度
当然,曝光的数值也是有参考的,HDRP系统是完全基于物理的,所以直接去看现实中每个场景的曝光值就好了,下面我列举出一些:
●full sunlight:大太阳的天气(曝光:15)
● partly cloudy:少云的天气(曝光:14)
● cloudy:多云的天气(曝光:13)
● deep shade:树荫,遮阳的地方(曝光:12)
● twilight:黄昏时分(曝光:10)
● home interior:屋内场景(曝光:6)
● candlelight:依靠烛光照亮(曝光:4)
● moonlit night:月光照亮的夜晚(曝光:-3)
可以参考以上数值
Automatic(自动曝光):
这个自动曝光一般用于全局,他的曝光过度不需要通过BlendDistance来控制过度
举个例子,从阳光刺眼的外面回到山洞的时候他会自动检测曝光并且设置过度区域,这样就不用像固定曝光一样还要添加一个Volume然后设置过度
Curve Mapping(曲线控制曝光):
通过曲线来控制曝光,X轴代表我们当前的曝光,Y轴代表我们想要的曝光,这个在这里太过专业不做过多讲解,这个一般是业内专业人士才会用的,专业篇章会讲
Use Physical Camera(物理相机控制曝光):
如果选择这个选项那么下面的字段只会剩下Compensation(补偿)这一项,也是直接调整曝光度的
什么是物理相机?在Camera组件中是有现实中的照相机相关的参数调整选项的,如Iso、Shutter Speed和Aperture参数等等,可以模仿真实的相机参数调整,如果对相机比较熟悉也可以使用这个方法来调整指定相机组件的画面
这个的好处是如果你对现实中的相机非常熟悉的话可以更轻松的将画面调整到你想要的效果
Visual Environment(环境设置)
这里用于控制整个场景的天空盒以及天空盒的环境光照对于场景的影响
这里的天空盒有四种类型(Type):
None:不渲染天空盒
Gradient Sky:将渲染的天空分成高、中和低三层,你可 以为这三层分别指定一个颜色(这个后面会讲)
HDRI Sky:使用一个立方体贴图贴图来渲染整个天空(常见天空盒)
Physically Based Sky:直接模拟出一个天空出来,模拟出来的天空呈现蓝色,主要特点体现在模拟现实的大气层,越高大气层的空气密度越低,他有真实的天空光照,会基于真实的大气层反射模拟,比如打一盏平行光模拟太阳光,根据平行光的旋转会自动模拟正午,黄昏,夜晚,清晨等时段的光线与天空样貌,并且平滑切换,会在改变天空盒的同时自动更新光照探针和反射探针
Ambient Mode:(环境光照模式)
这里一共有两种模式:
Static(静态模式):固定环境光照,将天空盒的环境光照预渲染,适用于固定场景
Dynamic(动态模式):动态改变环境光照渲染,会每帧检测环境光照渲染,会根据 Physically Based Sky或者通过代码改变天空盒或者环境光照时会实时渲染改变环境中的光照
区别:前者更适合静态场景,后者更适合动态场景
HDRI Sky(HDRI天空)
在Visual Environment(环境设置)中将Type(类型)设置为HDRI Sky(用一个立方体贴图来渲染)所用的天空盒不是直接使用场景配置的天空盒(这点很重要),用的是在Volume组件中重载出来的天空盒(如HDRI Sky重载),重载出来的设置
HdriSky:
放置一个立方体天空盒贴图 ,可以去网上找或者Unity商店也有
Intensity Mode中的3个选项都是与场景亮度有关的,自己看着调整就行
Rotation(旋转HDRI贴图):
就像文字描述一样,拖动滑块旋转天空盒
Update Mode(更新模式):
更新天空盒信息的三种模式
〇 On Changed:当天空盒参数发生变化就会更新
〇 On Demand:只有通过脚本调用更新API才能更新
Realtime:每隔一段时间固定检测更新
Exposure(屏幕曝光)
之前就讲过这个字段,现在就来详细讲讲他Automatic(自动模式)下的参数设置
Automatic(相机曝光采样方式):
Fixed:对整个画面进行采样
Spot:只针对画面中心进行采样,可能会采样不准确
Center Weighted:取两者的优点,会在每个像素点分配权重,画面中心的像素点权重高一些,一般也是用这个
**Limit Min和Limit Max:**用于控制场景曝光的最大值和最小值,主要用于控制场景中最亮部和最暗部,比如房间内和户外无遮挡处
将Limit Min提高会使暗部提亮,将Limit Max减少会使亮部降低
这个听起来可能有些奇怪,下面我来解释一下原理
当使用自动曝光时,系统会在最大值和最小值之间取一个固定位置的数值,什么是固定位置的数值?如百分之50,百分之70
当系统在最大值和最小值之间取了百分之50,也就是中间值为场景曝光,那么你将最小值变大,整体就会向最大值移动,那边中间值就会随着变大
将最大值变小,最小值不动,那么中间值就会随着变小
(越靠近被改变的一方数值变化的就越明显,比如调整最大值,那场景中亮部的改变就会比较明显)
一定要记住,自动曝光不是在1到100之间选择固定的数值,而是在你设置的最大值和最小值之间进行挑选出固定比例的值
在这里一般用于单独调整亮部不能过曝和暗部不能太暗
Compensation:
这个类似相机上的曝光补偿,如果你对画面整体的自动曝光感觉过曝或者过暗,那么就可以通过这个来调整
Adaptation(适应)
这个字段下面的设置主要用于控制曝光从暗部到亮部的过度
Mode:
曝光过度模式:
Fixed(固定的):HDRP中固定的模式
Progressive(渐变的):这个可以自由调整曝光的变化速度,这个模式可以分别设置Speed Dark to Light(从黑暗到光明的变化速度)和Speed Light to Dark(从光明到黑暗的变化速度)
Fog(雾效)
这个重载就是控制场景中的雾的效果
下面来讲解一下各个参数
Enable:
用于一键开关雾效
Fog Attenuation Distance(雾效衰减距离):‘
可以理解为在雾中可以看多远的距离,比如设置为1米那么在雾里面就只能看到前面一米的东西
Base Height(基础高度):
这里的数值是说雾从下向上多少米还是衰减,指的是雾保持浓度的基础高度,比如将数值设置为2,那么雾从地面向上两米后才开始衰减
Maximum Height(最大高度):
这里指的是能控制雾的浓度的最高高度,到达了指定高度后雾的浓度就会统一降为最初浓度的百分之37,比如将数值设置为10的话那么雾从基础高度到达10米之前会一直衰减,到达十米后最大衰减到百分之37,衰减到百分之37后就会停止衰减,10米往后就会一直保持最开始百分之37的浓度
Max Fog Distance(雾效最大距离):
这里的数值指的是从相机开始,雾的最大渲染距离,建议雾的最大渲染距离要超过相机组件的ClippingPlanes→Far(相机最大渲染距离)设置,不然天空盒上的 雾和场景中的雾就会看起来不一样
Color Mode(颜色模式):
这里可以选择两种模式
Constant(不变的颜色):也就是单一颜色
Sky Color(天空颜色):这个适用于有天空盒的场景,HDRP会根据天空盒的颜色来控制雾的颜色
在这个模式下会多出一个选项,Tint这个选项选择的颜色会与天空盒的颜色进行相乘,并不会大幅度改变雾的颜色而是根据选择的颜色融合雾本身的颜色
Volumetric Fog(体积雾):
想要场景有体积雾效的效果就要打开这个选项,比如看得到体积的乌云等,注意这个比较消耗性能,要根据实际的来
Albedo:
用于控制雾的整体颜色,不过我们一般不调整他,因为在自然界中雾的颜色是根据环境光以及天空反射来的
Anisotropy(各向异性):
这个会模拟场景中雾的粒子与场景中光线发生散射的效果,比如红色的光找到雾的身上那么那一段雾的颜色会往红色转变一些
他的数值控制的是转变的程度,如果数值大于1那么就会像那个光的颜色转变的多一些,比如更加的红,如果数值小于1就会起反效果
Ambient Light Probe Dimmer(环境光光照探针调光器):
这个设置用于调整雾对环境光的曝光度,数值越高雾的颜色越亮
使用Density Volume添加局部雾效
上面我们也将了关于雾的设置还有局部雾的设置,这里说一下要怎么创造局部雾出来
这里有一点我个人的心得,在制作体积雾的时候教程做出来的时候是全部紫色的,但是我做出来的有一部分是红色的,在我经过多次调整后发现了一点书上没有提到的,就是在没有打到我打的环境光的位置是紫色的
我使用的场景是已经用光照贴图渲染好的,所以场景中的光比较特别,就算将平行光给关掉场景中也会有自己的光,当平行光找不到的地方但是场景中的光有照射得到的地方雾的颜色会根据光打到的颜色改变颜色
当没有平行光打到雾上的时候雾呈现黑色
也就是会有像一般的雾一样的特性(各向异性以及环境光照反射)
下面来讲解具体 步骤:
首先要在hdrp配置文件和帧设置中打开体积雾相关的设置
包括前面讲到的,想要场景中出现雾的效果帧设置中的Fog一定要打开
第一步:
点击菜单栏的GameObject->Rendering->DensityVolume
场景中出现了一团雾气
在场景中找到DensityVolume物体将他拖动到合适的位置上后调整参数
Single Scattering Albedo(单次散射反照率):用于控制雾的颜色
Fog Distance(雾效距离):用于控制雾的浓度
Size(大小):用于控制长方体的长宽高,也就是雾的大小
Blend Distance(混合距离):让雾的边缘从没有到有的逐渐加深距离,可以让雾看起来不那么僵硬
第二步:
在Single Scattering Albedo设置一个喜欢的颜色
第三步:
将 Fog Distance设置为10,让雾看起来不那么浓,将Size设置为10,5,3,让其可视性更好一些,然后将 Blend Distance(混合距离)设置为0.5让雾更加柔和
这样一个基本的体积雾就做好了
Lighting(光照)
这个主要有4个重载在这里做大概讲解,等到了光照章节在做详细讲解
Ambient Occlusion(环境光遮蔽):
这个主要是针对环境中的孔洞和夹角缝隙的阴影进行渲染,环境光遮蔽是什么我们之前的博客也讲过了,注意这个环境光遮蔽的效果是针对画面中的物体的,也就说说如果被遮蔽的物体在画面内,遮蔽他的物体在画面外就会不显示环境光遮蔽的效果
Indirect Lighting Controller(间接光照控制器):
用于控制间接光照,主要控制场中的反射探针和灯光探针的数值
IndirectDiffuseLightingMultiplier:场景中间接漫反射光照强度,给他的数值属于一个乘值,也就是在场景本身间接漫反射光照的强度上做个相乘
主要使用场景在场景中暗部的间接光照不足的时候提升场景中间接光照反射的强度
ReflectionLightingMultiplier:这个字段控制的是间接镜面反射光的强度,一般用于调整平面的镜面效果反射,比如镜子的反射就会比一般的反射强一些可以设置为1.2,下雨淋湿的地面也会反射但是没那么强,就可以设置为0.6
IndirectDiffuseLightingLayer和ReflectionLightingLayer:
这里把这两个设置放到一起说,因为他们的作用是相同的,看名字就知道他们分别控制的是间接漫反射的层和间接镜面反射的层,下面来说说他们的具体用法
上面在间接镜面反射的地方我们提到过镜子的间接反射强度和打湿的地面是不一样的,所以一个场景中的间接反射会不相同,那么就要分别设置间接反射到对应的位置,这时候就需要用层级将他们区分开来,让地面和镜面处于不同的层级单独重载Indirect Lighting Controller(间接光照控制器),在这里的两个设置就行分别设置漫反射和镜面反射的作用的层级
Reflection/PlanarProbeIntensityMultiplier:是专门控制平面反射探针强度的数值,这个主要针对的是全场的平面反射探针的整体强度数值
Screen Space Reflection(屏幕空间反射):
这个主要是让场景有屏幕空间反射的效果,关于屏幕空间反射在HDRP配置文件中就讲过了,要启用这个效果需要在Lighting中打开ScreenSpaceReflection
Screen Space Refraction(屏幕空间折射):
这个是控制场景中有屏幕空间折射效果的
Shadowing(阴影处理):
会在光照章节详细讲解
Sky(天空)
前面我们的讲了天空中的HDRPSky,然后简单的介绍过了另外两种天空Gradient Sky(渐变天空)和Physically Based Sky(基于物理的天空)
接下来我将详细的讲解一下这两种天空的参数设置
首先我们回忆一下HDRP天空使用的方式,是将环境光设置中的Type设置为HDRPSky这样场景所使用的天空盒就是在Volume中重载的HDRPSky了
相比于传统的直接将立方体贴图贴上天空盒,这样有详细设置的天空盒更加的灵活多变,也可以通过代码实时控制
Gradient Sky(渐变天空):
这个天空模式设置出来的是有渐变色的天空
Top、Middle和Bottom:这是分别设置大气层上中下的的颜色然后达到渐变的效果
为了显示的更加明显我用了红绿蓝三种更加明显的颜色
Gradient Diffusion:这个设置用于控制天空,地平线以及地平线以下的颜色比例,当数值越大,地平线的颜色占比越小,如果值为负数,那么天空和地平线以下的颜色会互换,数值越小地平线颜色占比越小
这么说可能不理解下面我来举例
当数值为10
当数值为-10
对比最上面的一般数值就可以看出效果
Intensity Mode:这个前面就说过了,同样是控制曝光度的模式,选择模式后在下面的Exposure调整曝光度
Update Mode(更新模式):
这个同样上面已经讲过了
Physically Based Sky(基于物理的天空):
使用方式同上,将环境光照的模式改为Physically Based Sky,然后在Sky、选项中重载一个然后设置参数