Unity-HDRP-Sense-13
4.4 光源类型和模式
这一节我们使用Sponza_Night_All_Lights场景来讲解所有光源的类型。
4.4.1 Unity中的光源类型有哪几种
在HDRP中可以通过Light 组件来控制光源类型有4种:Spot Light(聚光灯)、Directional Light (平行光)、Point Light(点光源)和 Area Light(面积光),如图4.83所示。
我们还可以使用材质中的Emission Input是(自发光输入)参数把网络转变成有自发光次啊之和控制的光源。以下是针对4种光源的具体描述和示例。
1.Spot Light(聚光灯)
聚光灯的特性是光纤可被限定在一个具有一定半径的追体内,对准一个方向投射光纤。因此,聚光灯可用于模拟室内环境天花板上的射灯、室外环境的探照灯、汽车的前大灯、手电筒等灯有固定的光线投射方向的人造光源。下面我们来看一下Sponza_Night_All_Lights场景中的两个具体示例。
(1)天花板顶灯
图4.84所示是场景中长廊顶部的顶灯,光源类型为聚光灯。
我们来看一下啊这盏灯的各项参数。在Hierarchy窗口哦中选择Ceiling_Lights_Top/Lamp_Ceiling_Long6/Spot Light。在Inspector窗口中我们可以看到,Light组件的参数分成5个部分:General(通用设置)、Shape(灯光形状)、Emission(发光设置)、Volumetrics(体积光)和 Shadows(阴影)。
-
General(通用设置)
如图4.85所示,在这里可以修改灯光的类型,现在的光源类型是Spot(聚光灯),但是我们可以随时将其改成其他类型(Directional、Point或Area)。
- Mode(光源模式):可以选择Realtime(实时)、Mixed(混合)或者Baked(烘焙)。我们这里选择Mixed模式。如果悬着Reltime,这盏等只提供直接光照;如果选择Baked,只提供烘焙到光照贴图和光照探针(Light Probe)中的光照信息(烘焙完成后我们可以禁用这盏灯,因为在游戏运行时这盏灯不再会发挥作用);Mixed模式时最灵活的模式,它能提供直接和间接光照信息,而且在游戏运行时,除了通过光照贴图提供间接光照信息,也能提供实时光照和阴影。在后面的光照烘焙部分我们将会讲述在Mixed光艳照模式下,静态物体额动态物体不同的光照红不给模式下如何接受光照和产生阴影。
在后面面的光照烘焙部分我们将会讲述在Mixed光照模式下,静态物体和动态物体不同的光照烘焙模式下如何接受光照和产生阴影。
单击图4.85所示界面右上角的齿轮按钮,打开Light Layer(光照层)参数。使用此参数可控制当前这盏灯对场景中的那些物体投射光纤。后面我们会专门介绍如何用Light Layer。
- Mode(光源模式):可以选择Realtime(实时)、Mixed(混合)或者Baked(烘焙)。我们这里选择Mixed模式。如果悬着Reltime,这盏等只提供直接光照;如果选择Baked,只提供烘焙到光照贴图和光照探针(Light Probe)中的光照信息(烘焙完成后我们可以禁用这盏灯,因为在游戏运行时这盏灯不再会发挥作用);Mixed模式时最灵活的模式,它能提供直接和间接光照信息,而且在游戏运行时,除了通过光照贴图提供间接光照信息,也能提供实时光照和阴影。在后面的光照烘焙部分我们将会讲述在Mixed光艳照模式下,静态物体额动态物体不同的光照红不给模式下如何接受光照和产生阴影。
-
Shape(光源形状)
如图4.86所示,Shape参数用于控制射出光纤的整体形状,可以选择Cone(圆锥体),Pyramid(金字塔)和Box(长方体)。
图4.87所示顶灯的形状时Cone(圆锥体),其对应以下三个参数:
- Outer Angle(外部角度)(红色箭头线条),用于控制圆锥体的外射角度。
- Inner Angle (内部角度)(绿色箭头线条),用于控制内测的圆锥体角度(注意这里的单位时百分比%)。
- Radius(半径范围),用于控制光源的半径范围。此参数对高光的强弱、灯光的所见还有阴影的柔和成都都有影响。此数值越大,产生的阴影越柔和。
注:Pyramid和Box两种光源形状对应不同的相关参数,具体使用方法 请参考相关文档。
-
Emission(发光设置)
发光设置(Emission)参数如图4.89所示。
-
我们可以通过Filter(过滤)或者Filter + Color Temperture(色温)的方式来调整灯光的颜色。
当没有启用Color Temprature选项时,改变Filter的颜色可以直接改变灯光的颜色。
当启用ColorTmperature选项时,HDRP会使用Filter选择的颜色和Color Temperature的颜色进行计算以获得最终的灯光颜色。
这里我们将Filter设置为纯白色(这回Filter选择的颜色对最终灯光颜色的影响移除),把色温设置为3700K(单位为kelvins,中文翻译为"开尔文")。使用色温来控制灯光颜色的好处时我们不必通过猜测来设置灯光颜色,二十通过物理世界中的参考值来设置色温,从而获得正确的灯光颜色。色温的数值我们可以参考附录A中给出的基于物理的光浩单位和参考数值。
-
聚光灯的Intensity(光照强度)单位可以选择Lumen(流明)、Candela(坎德拉)、Lux(勒克斯)和EV100,这里选择留名作为单位,数值设置为200,因为我们像模拟走廊里装饰性的顶灯。参考数值可以查看附录A。你可以使用其他光照单位。HDRP会在单位或自荐进行自动换算。
-
Range(光照范围):这里设置为5m。该参数用于控制光源能够出大的最远距离(不适用于平行光,因为平行光用于模拟没有距离的光源,比如太阳光)。
-
indirect multiplier(间接光倍数):用于控制当前光源在光照贴图烘焙时生成的间接光照强度。具体行为如下:
如果设置为0,则在光照烘焙时此光源不会生成任何间接光。
默认数值为1,用于模拟真是世界的间接光照。如果要为受当前光源影响的场景增加更多间接光。则可以将此数值设置为大于1。
如果没有在Lighting窗口中勾选Baked Global Illumination(烘焙的全局光照)选项,那么此选项不起作用。 -
Cookie (光纤遮罩):无需消耗很多性能就可以通过使用一张2D为你或者Cubemap来模拟复杂的光照效果。详细介绍请参考附录C。
-
如图4.90所示,单击Emission界面有上交的齿轮(带加号)按钮,可以打开与当前光源性转给相关的额外参数。
- Reflector(发光板):打开此选项,可以在聚光灯后模拟处一个 “隐形”的泛光板。因为聚光灯本质上市一个加上了遮挡形状的Point Light(点光源),所以反光板的作用时把聚光灯向后发射的光进行反射,从而可以子啊不增大光照强度的情况下大大增强聚光灯的光照强度。
- Affect Diffuse(影响漫反射):默认为打开状态,已至此光源的光照信息会影响所物体表面的满反射(Diffuse Color)。
- Affect Specular(影响高光):默认打开状态,一致此光源的光照信息会影响受光物体表面的高光。
- Range Attenuation(光照范围衰减):默认为打开装填,意指光线会按照Range(光照范围)的设置进行帅见;如果禁用该参数,则光线不会按照Range的设置衰减(光照效果会变得很不真实)。
- Fade Distance(光照小时距离):如果当前画面的相机离开光照的Intensity数值相乘。其默认数值为1,意思时当前的光照强度就是前面设置的Intensity数值。我们可以咋这里调整光源的光照强度,但是无需调整之前设置的Intensity的数值。通过控制这个背书数值,可以用Timelien、动画或者脚本来动态控制光源的光照强度。
-
-
Volumetrics(体积光)
在当前场景的Scene Settings Volume 中我们添加Fog(雾)选项,因此如果在光源下启用Volumetrics选项(如图4.91所示)。将会生成光源形状配置的体积光效果,此选项不支持Area Light(面积光)。- Multiplier(体积光倍数):用于控制体积光的光照强度。
- Shadow Dimmer(阴影调光器):用于控制体积雾的强度。如过设置为0,则可以让体积雾撒建设的计算加快,提高游戏运行性能。
-
Shadows(阴影)
图4.92显示的是Light组件中阴影的默认参数-
Enable选项:一般情况下我们都会启用光源的阴影选项。当然,如果场景设计需要,也可以选择禁用阴影。
-
Update Mode(更新模式)
- Every Frame(每一帧):HDRP 会对每一帧都计算并更新阴影。
- On Enable(Game Object启用时):只在当前光源的Game Object启用时计算并更新阴影。
- On Demand(按需更新):只有在脚本中通过调整光源Game Object上的HDAdditionalLightData组件request ShadowMapRendering()方法时才会计算并更新阴影(在之后的HDRP版本中,HDAdditionalLightData 组件可能会被取消。如果你使用的HDRP版本不存在HDAddtionalLightData组件,可参考文档的具体描述)。
-
Resolutin(阴影分辨率):用于设置阴影的分辨率大小。有5个选项:Custom、Low、Medium、High和Ultra。
这些选项对应的具体分辨率数值可以在HDRP配置文件中进行指定,如图4.93所示。-
对于Directional Light:使用Directional Shadow Resolution Tiers来控制这些选项对应的分辨率数值。
-
对于Spot Light和Point Light:使用Punctual Shadow Resolution Tiers来控制。
-
对于Area Light:使用Area Shadow Resolution Tiers来控制。
阴影分辨率越高,阴影越清晰,当然性能消耗也越大。
-
-
Near Palne(近平面):单位为m,用于控制当前光源到受光源到受光物体开始投射阴影的距离。可以把这个平面想想成一个于光源投射平面平行的一个平面。我们使用表4.4说明此参数的使用效果。从性能角度看:
- Distance Shadowmask模式对GPU造成的压力较大,但是阴影效果更真实,因为相比通过光照红被获得的阴影,实时阴影的分辨率更高。
- Shadowmask模式则对内存压力较大,因为要让靠近相机的静态物体有清晰的阴影,我们必须使用较大分辨率的阴影纹理。
-
Contact Shadows(接触阴影)介乎阴影的作用时捕捉使用普通阴影算法无法获得的阴影细节,比如在一起表面交接区域的阴影。接触阴影时通过Ray marching算法采样屏幕的Depth Buffer(深度缓冲区)中的数据计算获得的,所以它本质上是一种基于屏幕空间的阴影。因此接触阴影会因为无法采样到屏幕空间外的数据,导致某些时候在屏幕边缘出现阴影瑕疵。
要使用接触阴影,除了Light组件中启用Contact Shadows选项,还要在当前场景的Volume组件中添加Contact Shadow选项,如图4.94所示。
Volume组件中的Contact Shadow的各项参数的作用是控制场景里所有已经启用了Contact Shadow选项的光源。可以通过这里的Enable选项关闭场景中所有的接触阴影(即使Light 组件中的Contact Shadow 处于启用状态)
如图4.95所示,我们可以在HDRP配置文件中控制Contact Shadow的采样质量。Sample Count(采样值)越高接触阴影的质量越高,当然性能消耗也越大。
关于接触阴影的一个使用建议是,这属于经商天花的细节阴影,如果因为打开Contact Shadow选项而导致游戏性能下降,或者出现明显的阴影瑕疵,则可以选择禁用该选项或者把Opacity(透明度)调低。这样可以让接触阴影产生的瑕疵变得不那么明显。
-
Shadow (阴影)额外参数
如图4.96所示,我们可以单击界面有上交的带加号齿轮按钮打开额外的阴影参数这些额外参数与聚光灯相关,你选择不同的光源类行的模式会呈现不同的额外参数。因为聚光灯的额外参数基本上代表了所有光源类型的额外参数,所以我们那聚光灯的额外参数来学习。
-
Slope -Scale Depth Bias
此参数用于避免阴影产生自我交叉。HDRP会使用这里的偏移值进行最终阴影距离计算。
我们可以通过HDRP的Debug窗口来查看不同的数值下的阴影效果。通过菜单Window->Render Pipeline->Render Pipeline Debug打开窗口,如图4.97所示,打开Shadow Debug Mode选项。我们通过表4.6来对比将Slope-Scale Depth Bias设置为不同数值是的阴影效果
-
Nomal Bias(法线偏移):用于控制受光物体表面法线的偏移量。使用该参数在默写情况下可以解决漏光的问题。
-
Custom Spot Angle(自定义聚光灯角度):(只适用于聚光灯)在阴影渲染时指定一个自定义的圆锥体角度,也就是说在渲染阴影的时候不适用光源的圆锥体角度。
启用此选项后会出现用于调整Shadow Angle(阴影角度)的滑块、其数值在1-Outer Angle之间。也就是说,如果Shape中的Outer Angle数值为120(度)。那么Shadow Angle的最大数值也为120(度)。 -
Dimmer(调光器):用于控制阴影的透明度。数值越小,阴影越透明。
-
Tint (着色):用于为阴影进行着色。这会应i想实时阴影和基础阴影,但不会影响烘焙获得的阴影。
-
Penumbra Tint(仅为半影着色):如果启用此选项,则着色之uhi应用到半影中。
表4.7展示了不同的Tint和Penumbra Tint组合能够产生的阴影效果。 -
Fade Disatnce(阴影消失距离)
用于定义光源与相机距离多近时渲染阴影。两者之间的距离在此数值内时,光源产生的阴影会被渲染,此时在画满中就可以看到阴影;两者之间的距离大于此数值时,当前光源产生的阴影不会被渲染,此时在画面中看不到光源产生的阴影。 -
Link Light Layer(关联光照层)和Light Layer(光照层)
在默认情况下,当前光源会为场景中所有符合条件的物体投射阴影。通过使用Light Layer,我们可以让当前光源职位场景中的某些物体投射阴影(前提时这些物体已被指定给某个Light Layer)。 Light Layer的使用方法将会在后面章节详细讲解。Link Light Layer 和 Light Layer这两个参数存在如下联动关系:
如果禁用Link Light Layer,则可以为阴影单独指定Light Layer。这个Light Layer可以与之前在General中设置的光照Light Layer不同。也就是说同一盏灯的光照Light Layer和阴影Light Layer可以不同。
如果启用Link Light Layer,则阴影Light Layer会沿用之前在General中设置的光照Light Layer。这意味这同一盏灯的阴影Light Layer总是与光照Light Layer相同。
-
-
(2)探照灯/强力射灯
对于探照灯或这汽车前大灯这一类光源,在灯泡的后面都会防止一块反光板用来增强光的强度。在HDRP中我们可以用聚光灯作为光源类型,在启用聚光灯的Reflector选项来模拟这一类灯光的效果,如图4.98所示。
表4.8对比了在不同光照强度下,启用和禁用Reflector选项产生的效果。
在创建这一类光源时,可使用以下方式来模拟探照灯或者汽车前大灯的效果:
- 根据这一类光源的实际发光强度(可以参数汽车签单等的Lumen数值,比如产品包裹上的Lumen数值)来设置Intensity的数值(单位为Lumen)。
- 启用Reflectior选项。
2.Drectional Light(平行光)
该光源进行带方向的光线投射,但是其没有投射距离的概念。可用于模拟自然光源,比如太阳光、月光灯。
因为没有光纤投射距离的概念(无限远),所以平行光的Light组件中不存在Range Attenuation和Fade Distance 这样的参数。
平行光参数中有一个Celestial Body(天体)参数组时别的光源类型中没有的。此参数组仅在我们使用Volume中的Physically Based Sky 作为Visual Environment时才会起作用。
如图4.99所示,当前场景中的平行光光源为整个场景添加月光亮度的光照信息,你可以在途中的地面上看到微弱的月光。
3.Point Light(点光源)
该光源想四面八方投射光线。可用于模拟普通灯泡比如室内天花板上的顶灯和吊灯,模拟从灯笼中发出的光,以及与提供火焰特效的光源配合使用灯。我们的夜间场景中大多数灯具的光源类型都是点光源。下面分别看一下灯具的组成。
作为主光源一部分的路灯
在Hierarchy窗口中找到如图4.100所示的这盏路灯的GameObject,如图4.101所示。
这盏灯主要有4部分组成。
-
Mesh_street_light:灯具的模拟网络,包括灯罩和下面的支架。请注意,在此物体的Mesh Renderer组件中,将Rendering Layer Mask 设置为了Light Layer 3,意思是只有那些在Light 组件中把Light Layer 3加入影响范围的光源,才能为物体提供光照信息。具体设置如图 4.102所示。
-
Mesh_bulb_emissive:在灯具中央,用于表示灯泡的模型网络带自发光材质,但是不是光源的一部分。自发光材质只是用与表现这时一个灯泡。
-
Main_Point_light:灯具的主光源。自带Light Cookie (光线遮罩),用于模拟光线被灯具遮蔽的效果(灯具本身的阴影),启用了体积光和阴影效果。具体参数设置如图4.103所示
如图4.103所示,这里的Light Layer 被设置为Light Layer defualt,所以这盏灯不会照亮灯具模型 (因为灯具模型的Light Layer被设置为了Light Layer3)。
另外,如图4.104所示,在阴影的额外参数中,请注意,我们没有勾选Light layer 3这一层,这意味这主光源将不会投射灯具模型本身的阴影(在画面中看到的灯具本身的阴影,是通过Light Cookie生成的)。
-
Glass_point_light:灯具的次要光源。因为它的作用只是提供玻璃灯罩的效果(让玻璃灯罩发光)和把灯具本身照亮,所以并不需要启用体积光和阴影效果。Intensity(光照强度)数值也不用很高,可以将Range限制在很小的范围内。具体参数设置如图4.105所示。
图4.104 Light组件中Shadows->Shadow Map额外参数组中的Light Layer参数
请注意,这里的Light Layer 被设置为Light Layer3,因此这盏灯会照亮灯具模型本身。
可能大家有疑问,为什么要用一个额外的电光源来照亮玻璃灯照和灯具本身呢?我们通过表4.9中的两站图来说明不同的设置对最终灯具渲染效果的影响。
下面给出了几个电光源的应用示例,如图4.106~图4.108所示。
装饰性的路灯吊灯
为火焰特效提供光照
4.Area Light(面积光)
该光源通过整个面投射光线。可用于模拟从室外通过窗户向室内投射光线的效果,例如摄影棚中的反光板等。
我们在夜晚场景的一扇门前放一个长方形的面积灯,来模拟一个发光通道的入口(在Hirearchy窗口中找到Area Lights组件的Game Object)。光照效果如图4.109所示。
面积光的参数于之前详细描述过的聚光灯的参数大多数是相同的,因此我们在这里之讲解面积广独有的参数。
(1)Shape(光源形状)
如图4.110所示,当前画面中使用的是Rectangle(长方形)的光源,可以通过Size X和Size Y来控制面积光的宽度和高度(以m为单位)。
如图4.111所示,也可以将其换成Tube(管状)灯,仅用了实时光照,不提供间接光照。Length用于控制管子的长度(单位为m)。
如图4.112所示,将其换成Disc(碟状)灯,仅用于生成烘焙光照信息,不支持实时光照。Radius用于控制碟子的半径(单位为m)。
Emission选项中的Display Emissive Mesh(显示自发光网格)选项。
对于长方形和管状的面积光,我们可以勾选Display Emssive Mesh来显示光源本身(参数设置如图4.113所示)。启用此项以后,HDRP会自动生成一个网络,并添加自发光材质到网格上面。Cast Shadows、Motion Vectors和Same Layer(Custom Layer)这些选项都是用来设置HDRP为面积光生成的网格的
Shadow选项中的额外参数(以下参数仅使用于长方形面积光)
如图4.114所示为长方形面积光额外的阴影参数
-
Shadow Cone(阴影锥体角度):用于控制投射阴影的锥体角度大小。数值范围在10~179度。数值越大,锥体的阴影投射范围越广。
-
EVSM Exponent(EVSM指数):使用场景的深度分布数据来计算阴影。增加此数值可以剑豪漏光情况的发生,并改变阴影的表现。
-
Light Leak Bias(漏光偏移):在阴影分辨率较低的情况下,有可能发生漏光情况。表4.10给出了在不同阴影分辨率下柱子阴影的具体表现。
(其他参数配置:Shadow Gone = 100; EVSM Exponent = 5; Variance Bias = 0;Blur Bias = 0)
很明显,阴影分辨率越高,阴影效果好,在High 和Ultra 分辨率下已经没有了漏光现象。不过分辨率的增大,必然导致内存占用增加,从而导致游戏运行性能下降。
表4.11则为我们展示了在应用Light Leak Bias之后的效果。可以清楚地看到,应用了Light Leak Bias以后,即使在Low(低)分辨率下,罗光地情况也大大改观。在Medium(中等)分辨率下,阴影地渲染效果可以于跟高分辨率下地阴影效果媲美。
(其他参数配置:Shadow Cone = 100;EVSM Exponent = 5;Variance Bias = 0;Blur Bias = 0)
-
Variance Bias :针对EVSM算法地数值修正。
-
Blur passes(模糊处理次数):用于控制HDRP对阴影进行模糊处理地次数。数值越大模糊处理次数越多,阴影越柔美,但是对性能地影响也越大。
5.自发光材质
自发光材质可以为场景中地静态物体提供光照,但不会对动态物体提供光照。动态物体可以通过Light Probe(光照探针)来获取光照信息(后面会详细讲解光照探针的原理及使用方法)。
在材质章节会详细讲解自发光材质地使用方法。
4.4.2 Unity中的光照单位
在Light组件中,光源类型和光照单位的对应关系如表4.12所示。
HDRP的光照系统完全基于物理来模拟的,因此当我们为某个光源选择照明单位是,需要来哦姐这个单位的具体含义,以及所选单位i的参考值,才有可鞥为场景打造真是可信的光照环境。每个光照单位的具体含义请参考附录A。
4.4.3 如何制作和使用Light Cookie为灯光添加跟个多细节
目前的实时渲染技术还无法完全模拟真是世界中各种光源生成的丰富多彩的阴影细节,比如无法在地段机器上模拟有光线追踪生成的软银鹰,也无法生成因为折射现象产生的教三效果(caustics)。
为了解决上书问题,我们需要使用预先制作好的Light Cookie 来模拟点光源和聚光灯生成的阴影细节。Light Cookie的本质是射出的光线i安眠覆盖一张图片。
在Sponza_Night_All_Lights场景中找到SpotLight -LightCookie。我么可以分别对标4.13中给出的ColofulLightCookie和SpotLightCookie这两张图片进行测试。
表4.14所示是通过将Light Cookie 应用到一盏聚光灯以后打出来的光(当Light组件的Shape属性被设置为Cone(圆锥体)时)
如果把Shape设置为Pyramid(金字塔)或这Box(长方体),则打出来的光会变成4.15所示的样子
从上面的例子可以总结处如下结论:
(1)通过Light Cookie 的光线可以使用Cookie上的颜色。
(2)光照的强度不受Light Cookie 的控制
如图4.115所示,在将用做Light Cookie 的图片导入Unity以后,要在导入界面把Wrap Mode 设置为Clamp而不是默认的Repeat。
如果设置成Repeat模式,当爸图片广联达哦Light 组件的Cookie属性上市,会受到如图4.11所示的警告: 如果不设置成Clamp模式有可能会导致打出来的光出现瑕疵。
以上时最简单的Light Cookie示例,因为使用的是聚光灯类型,所以只需要一张平面图即可实现Cookie的效果。但是如果要给点光源制作light
Cookie呢?如图4.117中所示的墙上的点光源会向所有方向投射管线,生成复杂的阴影小姑。对于这样的灯具,我们就无法使用简单的Light Cookie来实现复杂的阴影效果。
上述点光源使用的Light Cookie如图4.118所示。这是一张有6张图组成的Cubemap。
制作Cubemap类型的Light Cookie 要复杂得多。详细的制作方法可以参考附录C,其中详细列出了制作Cubemap类型Light Cookie的方法(使用3dsmax+Arnold渲染器和Unity的progressive Lightmapper两种方法),以及应用到HDRP光源上的具体步骤。
4.4.4 光照相关的常见问题汇总
1.为什么场景中会出现奇怪的阴影快
如果光源设计不当的话,我们可能会看到如图4.119所示的黑块(红色框标出),这些黑块会在相对固定的地方出现,有时候也会在镜头移动的时候随机闪烁。
HDRP使用的是一个可配置的瓦片/集群、延迟/前向的混合式光照架构(Configurable hybrid Tile/Cluster/Deferred/Forward lighting archiecture)。HDRP在代码中默认限制每一个Tile只能接受一定数量光源的光照信息。这个光源的数量被限制为24个。如果某个Tile接收到超过24个光源的光照信息,其上就会因为超过24个光源的那部分光照信息与现有光照信息"打架"而出现上述黑块。
我们可以打开Window ->Render Pipeline-> Render Pipeline Debug窗口,通过Lighting 部分查看每个Tile 具体记说到多少个光源的光照信息,界面设置如图4.120所示。
当前场景中的光源除了一个Directional Light 外,其他都是Spot或者Point光源。因为这两种光源都属于Puctual类型,所以把Tile/Cluster Debug By Category(根据灯光类型来做瓦片/集群调试)设置为Puntual。
打开Debug模式以后,我们可以在Scene窗口或者Game窗口看到叠加在场景画面之上的数据,如图4.121所示。你可以移动相机镜头,这些数字会随着画面的改变而改变。图4.121中用红色线框标出的区域为超过24个光源的Tile。大家可以看到数字越高,颜色越深,代表这个区域受光的光源数量越多。通过这种方式我们可以非常之光的看出那些区域需要优化。
解决黑块问题的方法本质上就是将所影响区域中,每一块Tile接收光照的光源数量限制在24个以下。我们可以通过检查场景中每一个光源的影响范围(Range数值)来限制同一个Tile接收光照信息的光源数量。
给图4.121中画面造成麻烦的时候,在城堡两端带五个灯泡的吊灯(4.122中用红框标出了这20个点光源),因为它们的Range数值被设置得过高。如果把这些电光源的Range数值设置成10(m),我们就能看到上面画面中的黑块。
我们可以在hierarchy窗口中找到这些点光源。经过测试和,把图中点光源的Range值设置成3.8.这样我们就可以把每个Tile解说光照信息的光源数量限制在24个以内,从而消除任何情况下的黑块问题。
当然,我们也可以接触每个Tile最多只能接受24盏灯光照的限制。打开Project Settings -> HDRP Defualt Settings -> Defualt Frame Settings For (Camera)的Light Loop Debug设置,然后将Deferred Tile 选项禁用,如图4.123所示。禁用Deferred Tile以后,上述的黑块就会消失。不过要注意的是,游戏在运行是帧率会明显下降,整个游戏的性能会显著下降。
2.为什么在相机头移动是场景中的阴影会扭曲或者闪烁
如图4.124所示,这时因为在HDRP配置文件中我们启用Dynamic Rescale选项的情况下场景中的Timeline动画,就会注意到图4.125中箭头所指的阴影会发生移动、闪烁或扭曲。
禁用Dynamic Rescale 选项,这些不自然的阴影表现就会自动消失(注:这样的因一个表现也有可能出现在内置渲染管线中,但是在内置渲染管线中是无法通过设置某个参数来解决这个问题的)
3.未启用体积光的High Quality(高质量)选项,可为什么编辑器中的灯光雾效会有那么多噪点。
在Project Settings->Quality->HDRP中,我们可以i查看HDRP配置文件中的Volumetric选项的设置,如图4.16所示。
如图4.127所示,没有启用High Quality (高质量)选项,但在编辑器模式下可以看到聚光灯打出的光柱包含很多噪点。
不过在游戏运行时,这些噪点则会消失。
原因:在编辑器中只是预览,所以如果不启用高质量选项,预览时会有早点。当然启用高质量选项不仅可以减少编辑器中的体积光噪点,在运行时也会获得更好的体积光效果,如图4.128所示。不过启用高质量选项也要付出很大的性能代价。
4.启用高质量选项对性能影响到底多大
打开Sponza_Night_All_Lights场景,我们分别在启用和禁用高质量选项的情况下运行场景,看看性能的对比。
(1)图4.129所示启用高质量选项时的运行数据。
(2)图4.130所示是禁用选项时的运行数据
我们可以看到,启用体积光的高质量选项对性能的影响时很大的,多少亿一定要慎用Voumetrics->High Quality 选项。
另外,如图4.131所示,上述测试使用的Lit Shader Mode是Deferred Only(在Deferred模式下,无法使用MSAA)。如果我们使用Forward Only模式,也会对性能早成影响。
注:上述测试的电脑配置为Intel(R) Core(TM)i9-9820X CPU @ 3.30Hz 3.31GHz,RAM 64GB,Nvidia GeForce RTX 2080。
5.Console窗口提示:“Max Shadow requests count reached。。。。”,该如何解决
图4.132中的报错,原因是当前场景中所有光源生成的阴影数量超出了在HDRP场景文件中指定的数量。
通过Edit ->Project Settings-> Graphics界面,我们看到与当前Scriptable Render Pipeline Settings相关联的HDRP配置文件是HDRendPipelineAsset-AllLights。
在Project窗口中选中HDRenderPipelineAsset-AllLights,然后在Inspector窗口中找到。Lighting->Shadows区域中的maximum Shadows on Screen设置。在这里可以设置允许同屏显示的最大阴影数量,当前数值是256。如果我们把此数值该成128,那么上述报错就会出现。
那么是什么原因导致当前场景中的阴影数量超过256个了呢?具体原因如下:
通过顶部菜单Windows->Rendering->Light Explorer打开Light Explorer界面。我们可以看到木气啊有28个点光源(Point Light),22个聚光灯(Spot Light)和1个平行光灯(Directional Light)。这些光源产生的阴影数量如表4.16所示
因此要解决上述问题,我们必须把同屏可以显示的最大阴影数量提升到大于218个。这样即使同屏显示所有的光源,也不会显示上述报错。
当然,如果场景中产生阴影的光源过多,也会对性能早成很大影响。