目录
一、光源类型和模式
1. Light组件
1.1 General(通用设置)
1.1.1 LightLayer(光照层)
1.2 Emission(发光设置)
1.3 Shadows(阴影)
二、Light Layer(光源分层)
三、光照探针
1. Light Probe Group组件
2. 使用光照探针的基本步骤
3. Mesh Renderer组件LightProbes下Blend Probes VS Use Proxy Volume
3.1 Blend Probes
3.2 Use Proxy Volume
3.2.1 Light Probe Proxy Volume组件
Refresh Mode(更新模式)
Quality(质量)
Bounding Box Mode(包围盒模式)
Bounding Box Settings(包围盒设置)
Proxy Volume Resolution(Proxy Volume分辨率)
Probe Position Mode(探针位置模式)
4.Mesh Renderer组件的Anchor Override参数
5.Preferences界面中GI Cache
四、使用Reflection Probe为场景提供反射信息
1. HDRP生成反射信息的顺序
2.Screen Space Reflection(屏幕空间反射)
2.1 Volume重载之Screen Space Reflection
2.1.1 Screen Space Reflection参数介绍
2.1.2 SSR的限制
3.Reflection Probe(反射探针)
3.1 Reflection Probe(反射探针)
3.1.1 反射探针组件
3.1.2 Planar Reflection Probe(平面反射探针)
4.Sky reflection(天空反射)
五、HDRP阴影
1. HDRP中的阴影分类和光照模式
2.在混合(Mixed)模式下投射的混合阴影
2.1 Lighting设置窗口的Mixed Lighting选项
2.2 如何将场景中的光源设置为Mixed模式
2.3 光源的Shadowmask Mode
2.3.1 当将光源的Shadowmask Mode设置为Distance Shadowmask时:
2.3.2 将光源的Shadowmask Mode设置为Shadowmask时:
2.3.3 Distance Shadowmask和Shadowmask两种模式对性能的影响
2.4 阴影的最大投射距离设置
一、光源类型和模式
使用"Standard"或"Standard (Specular setup)"着色器时,可以使用材质中的Emission Inputs(自发光输入)参数把网格转变成由自发光材质控制的光源。
1. Light组件
Light组件的参数分成5个部分:General(通用设置)、Shape(灯光形状)、Emission(发光设置)、Volumetrics(体积光)和Shadows(阴影)。
1.1 General(通用设置)
1.1.1 LightLayer(光照层)
要使用光源分层功能,首先必须在HDRP配置文件中将Light Layer功能打开。
点击General右边的︙,选择“Show Additional Properties”,可显示此参数。用此参数可控制当前这盏灯对场景中的哪些物体投射光线。下文会详细介绍。
1.2 Emission(发光设置)
使用色温来控制灯光颜色的好处是我们不必通过猜测来设置灯光颜色,而是可以通过物理世界中的参考值来设置色温,从而获得正确的灯光颜色。
单击Emission右边的︙,选择“Show Additional Properties”,可以打开与当前光源形状相关的额外参数。
1.3 Shadows(阴影)
关于接触阴影的一个使用建议是,这属于锦上添花的细节阴影,如果因为打开Contact Shadows选项而导致游戏性能下降,或者出现明显的阴影瑕疵,则可以选择禁用该选项或者把Opacity(透明度)调低。这样可以让接触阴影产生的瑕疵变得不那么明显。
二、Light Layer(光源分层)
在HDRP中我们可以使用Light Layer(光源分层)功能做以下事情:
- 让光源只照亮场景中指定的物体,并投射阴影。
- 让光源只照亮指定的物体,但是让其他物体投射阴影。
要使用光源分层功能,首先必须在HDRP配置文件中将Light Layer功能打开。在ProjectSetting->Graphics->HDRP Global Setting界面默认提供了8层,从Light Layer default、Light Layer 1一直到Light Layer7。
在使用Light Layer时,一旦在某个受光物体上应用了Light Layer,我们一定要注意物体周围的光源分布情况。因为只有将受光物体所在的Light Layer也指定给光源,才能让光源照亮相关的受光物体。
三、光照探针
我们可以为场景中的静态物体烘焙间接光照信息,但是如何为场景中的动态物体提供间接光照信息呢?答案就是使用光照探针。当然,光照探针的作用并不仅仅是为动态物体提供间接光照信息。
光照探针的具体作用如下:
- 为静态物体(包括LOD)提供间接光照信息。
- 为场景中那些比较小的物体提供间接光照信息。如果让这些小物体参与光照贴图烘焙,会因为占用光照贴图空间而导致光照贴图尺寸变大,进而导致内存占用升高影响运行性能,所以我们可以让这些小物体从光照探针中获取间接光照信息。
1. Light Probe Group组件
- Edit Light Probes按钮
在未单击Edit Light Probes按钮时,下面的所有参数和按钮为禁用状态。单击该按钮可以启用这些参数和按钮。
- Show Wireframe(显示线框)
可以显示或者隐藏上面示例图中用于连接黄色光照探针的紫色线框。
- Remove Ringing(移除振铃)
此选项默认为启用状态。“振铃”现象在明暗对比强烈的情况下可能出现。
- Selected Probe Position(选中的光照探针位置)
当我们在场景中选中某个光照探针时,这里会显示它的当前世界坐标信息。
- Add Probe(添加探针)
往现有光照探针组上添加一个新的光照探针。
- Select All(选中所有)
选择组里的所有光照探针。
- Delete Selected(删除选中的探针)
删除在组里选中的一个或多个光照探针。
- Duplicate Selected(复制选中的探针)
复制在组里选中的一个或多个光照探针。
2. 使用光照探针的基本步骤
- 启用模型网格的Mesh Renderer组件的Contribute Global Illumination(贡献全局光照)选项,这可以让网格参与全局光烘焙。
- 将Receive Global Illumination(获取全局光的方式)设置为Light Probes,而不是Lightmaps。因为设置成了从Light Probes获取间接光照信息,所以网格本身从烘焙所得的间接光照信息不会被保存到光照贴图中,从而达到节约光照贴图空间进而节省运行时内存占用的目的。
- 创建光照探针组(Light Probe Group):通过菜单GameObject→Light→Light Probe Group在场景中创建一个光照探针组。
- 通过光照烘焙完成间接光的生成:要想让光照探针起作用,我们首先要完成对整个场景的烘焙,因为光照探针上的间接光照信息来自光照烘焙。
- 如果要对光照探针组进行调整,需要注意以下三点:
- 如果调整了光照探针组,包括移动位置、增加/删除/修改了组里的光照探针,我们就需要重新烘焙场景。只有这样,修改过的光照探针才能获得正确的间接光照信息。
- 如果没有设置场景中的物体从Lightmaps获取全局光照信息,则默认情况下会使用Light Probes来获取间接光照信息。
- 光照探针摆放有一定的原则,否则容易造成穿帮。
- 在明暗交界的地方要多放一些光照探针。
3. Mesh Renderer组件LightProbes下Blend Probes VS Use Proxy Volume
3.1 Blend Probes
在使用Mesh Renderer组件的Blend Probes方式时,虽然物体会对周围4个光照探针进行采样,但是最终只会得到一种间接光颜色。当物体较小时,这是可以接受的。但是当受光照探针影响的物体体积较大时,将单一的间接光颜色应用到整个物体表面会产生不正确的间接光照效果。
3.2 Use Proxy Volume
3.2.1 Light Probe Proxy Volume组件
当Mesh Renderer组件的Light Probes选择Use Proxy Volume时,我们需要给Proxy Volume Override设置带Light Probe Proxy Volume 组件的物体。
Light Probe Proxy Volume组件可以在指定的包围盒(Bounding Volume)内部生成一个三维空间网格,其中包含以内插值方式替换的光照探针。这些以内插值方式替换的光照探针会被上传到一张3D纹理中,然后系统会采样这张3D纹理,让物体表面最终获得的间接光具有渐变效果,从而使得物体表面获得正确的间接光照信息。
-
Refresh Mode(更新模式)
包括Automatic(自动更新)、Every Frame(每帧更新)和Via Scripting(通过脚本更新)模式。
-
Quality(质量)
Low(低质量)和Normal(正常质量)。
-
Bounding Box Mode(包围盒模式)
- Automatic Local(自动本地空间):系统自动在本地空间生成一个包围盒把当前物体包围住,然后将当前物体层级下包含Light Probes属性的值设置为Use Proxy Volume。
- Automatic World(自动世界空间):系统自动在世界空间生成一个包围盒把当前物体包围住,然后将当前物体层级下包含Light Probes属性的值设置为Use Proxy Volume。
- Custom(自定义):按照设置的Size和Origin生成一个包围盒。
-
Bounding Box Settings(包围盒设置)
- Size(大小):定义包围盒的大小。
- Origin(原点):定义包围盒的原点。
-
Proxy Volume Resolution(Proxy Volume分辨率)
- Resolution Mode:可以选择Automatic(自动)模式,此时系统会为XYZ指定默认的每单位以内插值方式替换的光照探针数量,或者可以选择Custom(自定义)模式。
- X,Y和Z:选择自定义模式,我们可以自己指定每个方向上使用的每单位以内插值方式替换的光照探针数量。
-
Probe Position Mode(探针位置模式)
这些以内插值方式替换的光照探针被放在一个3D网格中。在这里我们可以选择这些插值探针在3D网格中的放置方式。在某些情况下,这些插值探针可能会穿透墙壁或者其他几何体,从而导致漏光现象的发生,这时我们可以尝试切换到Cell Corner或者Cell Center这两种模式来解决漏光问题。
4.Mesh Renderer组件的Anchor Override参数
使用Anchor Override(锚点重载)参数可以关联场景中的某个GameObject,并将其中心点作为当前物体对光照探针进行采样时的中心点。在默认情况下此参数为None,这时系统会使用当前物体网格的包围盒(Bounding Box)的中心点。
5.Preferences界面中GI Cache
GI Cache(GI缓存)是Unity编辑器使用的内部数据缓存,用来保存进行光照贴图烘焙、光照探针烘焙以及反射探针烘焙时生成的中间文件。在第一次烘焙完成以后,使用生成的缓存文件可以加快之后烘焙的速度。当前机器上的所有Unity项目共用同一个GI Cache。可以在Preferences界面调整缓存的大小、自定义保存的路径和启用针对缓存文件的压缩,以及清理缓存。
四、使用Reflection Probe为场景提供反射信息
在实时渲染应用中生成逼真的反射效果,同时又要保证渲染的帧率是一件很难的事情。在支持实时光线追踪的软件和硬件(足够强大且便宜到可以普及大众)出现之前,或者某种黑科技出现之前,我们都还需要依赖近似的方式来模拟反射效果。
1. HDRP生成反射信息的顺序
HDRP提供了一个反射层级来为屏幕上的每个像素提供尽可能正确的反射信息。在这个反射层级中包含三种生成反射信息的方式。HDRP使用它们的先后顺序为:首先使用Screen Space Reflection(屏幕空间反射,简称SSR)方式。如果没有找到合适的反射信息,HDRP会接着使用Reflection Probe(反射探针)。如果还是没有得到合适的反射信息,最后会使用来自天空的反射信息(Sky reflection)。
那么HDRP是如何判断什么是“合适的反射信息”的呢?HDRP在使用上述三种反射信息的计算方式时,会根据权重是否达到1来判断是否获得了“合适的反射信息”。这三种方式的权重计算如下:
- SSR会自动控制自己的权重。
- 反射探针的权重可以通过它的Weight属性进行手动编辑。你可以为不同的反射探针设置不同的权重,这样可以让有重合区域的反射探针进行合理的融合。
- 天空反射的权重固定为1。
2.Screen Space Reflection(屏幕空间反射)
要使用SSR,需要先在HDRP配置文件中将该选项打开,然后使用Volume中的Screen Space Reflection来调整相关参数。
可以在指定相机的Custom Frame Settings中启用SSR,但是前提是在HDRP配置文件中已启用了SSR。
在HDRP配置文件中启用SSR选项以后,可以在Volume中调整SSR参数。
2.1 Volume重载之Screen Space Reflection
2.1.1 Screen Space Reflection参数介绍
- Enable:可以一键启用/禁用当前Volume的SSR。
- Minimum Smoothness(最小光滑度):只有材质的光滑度(Smoothness)大于等于这里设置的数值,SSR才会在材质关联的物体表面起作用。(比如当前数值为0.9,场景中有三个物体,第一个物体表面的光滑度是0.8,第二个是0.9,第三个是0.95,则HDRP会对第二和第三个物体表面应用SSR,但是不会对第一个物体表面应用。)
- Smoothness Fade Start(消失开始光滑度):在这里可以设置的数值在Minimum Smoothness(最小光滑度)和1之间。如果把数值设为0.93,那么对材质光滑度小于0.93的物体表面不会应用SSR。
- Reflect Sky(反射天空):如果启用该选项,HDRP会使用SSR来处理天空的反射;如果禁用该选项,HDRP会使用下两个层级的反射方式(反射探针或天空反射)来处理天空的反射。
- Screen Edge Fade Distance(屏幕边缘消失距离):因为SSR是基于屏幕空间来计算的,所以反射效果受到当前屏幕可视区域的限制,因此使用SSR计算得到的反射效果是有“边界”的。在“边界”之外,也就是屏幕的可视区域之外的物体是不会出现在SSR的反射效果中的。
- Object Thickness(物体厚度):用于控制屏幕上物体的厚度。因为SSR算法无法分辨物体的厚度,所以这里的数值可以帮助SSR算法跟踪物体后面的物体。这是一个全局变量,针对场景中的所有物体。
- Quality(反射质量):可以选择Custom、Low、Medium和High质量等级。如果选择Custom,则我们可以使用Max Ray Steps来设置最大射线迭代数。Low、Medium和High的具体采样值可以在HDRP配置文件中进行设置。
- Max Ray Steps(最大射线迭代数):此数值用于控制SSR算法的最大执行数。到达最大执行数以后,SSR算法停止寻找网格。如果把数值设置为20,但是SSR算法只执行了5次就找到了网格,那么算法也会停止。如果你设置的数值太小,那么算法在找到网格之前就会停止。
2.1.2 SSR的限制
- SSR的反射信息是通过计算当前屏幕可见物体而得到的,因此获得的反射信息里只包含屏幕上可见的物体。
- SSR只支持不透明材质,无法让透明物体显示在反射中。
- 因为在计算的时候SSR只使用了深度缓冲(Depth Buffer)中的一个层,所以很难获取物体后面的信息。
3.Reflection Probe(反射探针)
如果HDRP无法通过SSR获得合适的反射信息,就会尝试从反射探针中获取反射信息。在HDRP中,我们可以使用Reflection Probe和Planar Reflection Probe两种反射探针。
3.1 Reflection Probe(反射探针)
反射探针会对自身周围的环境,从6个方向(前、后、左、右、上、下)抓取6张纹理保存在一张Cubemap(立方体贴图)中。场景中带反射的材质可以采样这些反射探针中保存的纹理,并将其作为反射信息应用到物体表面上。
可以通过菜单GameObject→Light→Reflection Probe创建反射探针,然后把这些探针放到场景中需要抓取反射信息的位置。在场景中的不同位置要放置不同的反射探针,这样不同位置的物体才能获取正确的反射信息。至于数量则没有硬性规定,按需使用。
反射探针按照类型可以分为Baked(烘焙)、Custom(自定义)和Realtime(实时)三种。这三者的区别如下。
- 烘焙和自定义两个类型本质上是一样的。烘焙类型是在编辑器里把反射探针周围的环境烘焙到一张Cubemap中;自定义类型则是直接指定一张已经做好的Cubemap。
- 实时类型比烘焙和自定义类型多了一个Realtime Mode(实时更新模式)。我们可以选择Every Frame(每帧都更新)、On Enable(探针启用时更新)和On Demand(通过脚本控制按需更新)模式。
- 实时类型是最消耗性能的。当然效果也是最好的,特别是当场景中的动态物体(如人物、车辆等)移动时,它可以实时出现在反射信息中。
- 如果使用实时类型,为了减少性能消耗,我们可以选择On Demand模式。使用On Demand模式时,我们可以用脚本控制反射探针的刷新率,比如每10帧更新一次。不过这要看具体应用的场景,如果是包含快速运动的场景,可能会因为更新不及时导致穿帮。
3.1.1 反射探针组件
Type为烘焙类型时各参数作用:
- Proxy Volume
反射探针在获取周围环境信息生成立方体贴图时,是以自身的位置为中心点来抓取反射信息的。因此当一个物体上的材质采样这些反射探针上的信息时,除非物体的坐标和反射探针的坐标完全一致,否则物体上的反射信息总会存在位置上的偏差。
为了解决这个问题,我们需要使用Reflection Proxy Volume(反射代理Volume)这个组件。HDRP会使用这个组件纠正由于上述位置偏差引起的视差问题。虽然该组件无法完全纠正视差问题,但是可以大大改善。
Reflection Proxy Volume组件:可以选择Box(长方体)、Sphere(圆球)或者Infinite(无限)作为Reflection Proxy Volume的形状。Box和Sphere形状一般用于室内场景。Infinite代表无限远,一般用于室外场景。
- Use Influence Volume As Proxy Volume
除了创建单独的Reflection Proxy Volume,我们也可以使用当前反射探针的Influence Volume(影响区域)作为Reflection Proxy Volume。因为反射探针自身有影响区域,所以大多数时候可以直接用反射探针的影响区域作为Reflection Proxy Volume。
- Blend Distance(混合距离)
(只适用于Deferred模式)用于定义当前反射探针与别的反射探针的混合距离。数值越大,内部的绿色盒子就越小。
- Blend Normal Distance(混合法线距离)
数值越大,内部的紫色盒子就越小。
Influence Volume(影响区域):用于设置反射探针在生成反射纹理Cubemap信息时影响的区域。在混合法线距离内,但是在混合距离外,会产生混合的反射效果。在混合距离内,会受到反射探针100%的影响。
- Volume Layer Mask(Volume层遮罩)
用于控制场景中哪些Volume会影响反射探针的反射信息捕捉操作。
- Volume Anchor Override
如果将其设置为某个相机的Transform,那么影响此相机的Volume将会影响当前的反射探针。
- Light Layer
如果在HDRP配置文件中启用了Light Layer功能,则可以在此指定当前反射探针影响的Light Layer。
- Multiplier
用于控制当前反射探针捕捉到的RenderTexture的亮度。数值越大,亮度越高。
- Weight(权重)
默认权重数值为1。数值越大,在对多个反射探针进行混合时,当前反射探针的反射效果在最终反射信息中的所占权重越大。
- Fade Distance(淡出距离)
用于控制反射探针在捕捉反射信息时的淡出距离。
3.1.2 Planar Reflection Probe(平面反射探针)
将某物体材质球的Metallic设为1、Smoothness设为1,此时这个物体就是一面完美的镜子。
4.Sky reflection(天空反射)
如果HDRP无法从反射探针中获取合适的反射信息,就会使用天空反射。因此场景中总是会存在来自天空的反射信息。
五、HDRP阴影
1. HDRP中的阴影分类和光照模式
HDRP中的阴影可以分为两类:
- 基于屏幕空间信息计算的阴影,包括:(见前文)
- Ambient Occlusion(环境光遮蔽)
- Micro Shadow(微阴影)
- Contact Shadow(接触阴影)
- 场景中光源投射的阴影,可以分为三类:
- 在实时(Realtime)模式下投射的实时阴影
- 在混合(Mixed)模式下投射的混合阴影
- 在烘焙(Baked)模式下投射的烘焙阴影
在三种光照模式中,混合模式提供的阴影最灵活,可以很好地平衡阴影质量和性能要求。因为实时阴影虽然质量高,但是也最消耗性能;烘焙阴影虽然性能最好,但是阴影质量比较差。
2.在混合(Mixed)模式下投射的混合阴影
2.1 Lighting设置窗口的Mixed Lighting选项
Lighting Mode:
- 在Baked Indirect模式下,所有物体(不管是静态物体还是动态物体)都会接受实时阴影信息,烘焙的光照贴图中不会包含阴影信息。
- 在Shadowmask模式下,不同的物体会接受不同的阴影信息
前面的文章曾介绍过Shadowmask和Baked Indirect之间的区别是:前者除了烘焙间接光照信息,也会在Lightmap(光照贴图)中把阴影烘焙进去。Shadowmask模式可以提供最逼真的阴影效果,当然性能消耗和内存占用也是较高的。Shadowmask模式适用于远处存在可见物体的场景,比如在高端机器上运行的开放世界游戏。
2.2 如何将场景中的光源设置为Mixed模式
确保下面四步设置后,我们就可以将场景中的光源设置为Mixed模式,然后在Shadowmask模式下完成烘焙操作。
- HDRP配置文件的Lighting→Shadows部分,启用Shadowmask功能
- 在Lighting设置窗口(通过菜单Window→Rendering→Lighting打开)中Lighting Mode选择ShadowMask作为Lighting Mode(光照模式)。
- 在Project Settings窗口的HDRP Global Settings中,勾选Frame Setting下Camera的Shadowmask功能。
- 如果当前场景中的相机启用了Custom Frame Settings,请确保Shadowmask功能为启用状态。
2.3 光源的Shadowmask Mode
经过上述四步骤后,我们就可以将场景中的光源设置为Mixed模式,然后在光源的Shadowmask Mode下有两个选项:
2.3.1 当将光源的Shadowmask Mode设置为Distance Shadowmask时:
通过Shadowmask光照模式烘焙所得的光照贴图,除了包含间接光照信息,还包含针对静态物体预计算所得的阴影信息。
在Distance Shadowmask模式下,如果在阴影的最大投射距离之内,对动态物体和静态物体都会投射实时阴影;如果在阴影的最大投射距离之外(设置方式见下文),不会对动态物体投射阴影,而静态物体使用烘焙所得的阴影。
在最大阴影投射距离之内的动态物体能获得其他动态物体和静态物体的实时阴影。因此我们看到蓝色和绿色胶囊体都能获得自己的实时阴影。绿色胶囊体获得了蓝色胶囊体的实时阴影;而蓝色胶囊体也获得了第一根静态柱子的实时阴影。
2.3.2 将光源的Shadowmask Mode设置为Shadowmask时:
所有的静态物体的阴影都来自烘焙阴影。因为烘焙阴影的质量偏低,所以看上去比之前的实时阴影要模糊。
动态物体还是能获得另一个动态物体的实时阴影。但是无法获得静态物体的烘焙阴影(因为阴影被烘焙到了光照贴图中,所以只能用于静态物体上)。
在最大阴影投射距离之外的动态物体没有阴影,静态物体则使用烘焙阴影。
2.3.3 Distance Shadowmask和Shadowmask两种模式对性能的影响
Distance Shadowmask模式更消耗GPU性能,不过能产生更真实的阴影效果,因为实时阴影质量较高。在最大阴影投射距离之外的地方使用的则是烘焙阴影。这些烘焙阴影的质量较低,但是因为离相机较远,所以低质量阴影也是可以接受的。Shadowmask模式需要消耗更多内存,因为要让靠近镜头的阴影看上去更真实,就需要更高分辨率的阴影贴图。
2.4 阴影的最大投射距离设置
最大阴影投射距离的设置,不同的光源类型有不同的设置方法:
- 对于平行光(Directional),我们需要通过Volume组件中Shadows中的Max Distance来设置(单位为m)
- 对于点光源(Point)、聚光灯(Spot)和面积光(Area),可以通过Shadows中的Fade Distance来设置(单位为m)