Notifications
Article
混合光照
Published 17 days ago
224
0
混合光源可在运行时更改其变换和视觉属性(例如颜色或强度),但仅限于严格的限制范围内。它们同时照亮静态和动态游戏对象,总是提供直接光照,也可选择提供间接光照。接受混合光源光照的动态游戏对象总是在其他动态游戏对象上投射实时阴影。
混合光照对于不属于游戏但可照亮静态环境的光源(例如天空中不动的太阳)非常有用。混合光源的直接光照仍需在运行时计算,因此静态网格上的材质将保持其视觉保真度,包括完整的基于物理着色(PBR)支持。要使用混合光照,请打开Lighting窗口勾选Baked Global Illumination。
可用的模式有:
  • Baked Indirect
  • Shadowmask
  • Subtractive

Shadowmask模式的Distance Shadowmask是资源最密集的选项,但可提供最出色效果:此选项可在阴影距离内产生高质量阴影,并在超出此距离后提供烘焙的高质量阴影。例如,只要太阳不穿过天空,就可以创建具有延伸到地平线的逼真阴影的大型景观。Shadowmask模式在仅支持四个渲染目标的平台上(例如许多移动端GPU)会回退到前向渲染(无延迟或光照Prepass 支持)。
Subtractive模式提供最低质量的结果:仅为一个光源实时渲染阴影,并将阴影与烘焙的直接和间接光照进行合成。只有目标平台无法使用任何其他模式时(例如,应用程序需要在低端移动设备上运行,但内存限制会阻止使用Shadowmask和Distance Shadowmask模式)才应使用此模式作为后备解决方案。Subtractive模式会回退到前向渲染(无延迟或光照Prepass支持)。

高级用途

混合光源可在运行时更改其变换和视觉属性(例如颜色或强度),但仅限于严格的限制范围内。实际上,由于某些光照是烘焙的(因此是预先计算的),在运行时更改任何参数都会导致在组合实时光照和预计算光照时出现不一致的结果。
在使用Baked Indirect和Shadowmask的情况下,直接光照的影响就像实时光源一样,因此您可以更改光源的颜色、强度甚至变换等参数。但是,烘焙值是预先计算的,在运行时无法更改。
例如:如果将红色混合光源烘焙到光照贴图中,但在运行时将其颜色从红色变为绿色,则所有直接光照都会切换为绿色。但是,所有间接光照都被烘焙到光照贴图中,因此它仍然是红色的。此情况同样适用于在运行时移动混合光源:直接光照将跟随光源,但间接光照将保持在光源烘焙位置。
如果仅对直接光照引入细微的变化(例如,仅稍微修改光源的色调或强度),则可以获得间接光照的优点并使光源看起来有一定程度的动态效果,但无需实时光源所需的额外处理时间。间接光照仍然不正确,但错误可能很细微,不会令人不适。这种方案对于没有预计算阴影信息的光源特别有效。为实现此方案,需要为光源禁用阴影,也可使用具有实时阴影的Baked Indirect模式。由于阴影遮罩是直接光照计算的一部分,因此移动此类光源会导致视觉上不一致,使阴影不能正确排列。

技术细节

在使用混合光源的情况下,光路的最后一段(即从光源到表面的路径)也成为预计算的一部分。但是,Unity仍然分别处理直接光照和间接光照。它将间接光照烘焙到光照贴图和光照探针中,然后在运行时对光照贴图和光照探针进行采样。间接光照通常为低频率,这意味着它看起来很平滑,但不包含高度细节化的阴影或光线过渡。因此,当阴影会产生高度可见的影响时,通过直接光照处理这些阴影。
阴影信息可预计算并存储在阴影遮罩中。阴影遮罩是一种纹理,它与相应的光照贴图共享相同的UV布局和分辨率。它存储每个纹理像素的最多四个光源的遮挡信息(因为纹理在当前GPU上限制为最多四个通道)。值的范围是0到1,中间的值标记柔和阴影区域。
如果启用了阴影遮罩,光照探针还会存储最多四个光源的遮挡信息。如果超过四个光源相交,则多余的光源会回退到烘焙光源。可使用阴影遮罩重叠可视化模式来检查此行为。此信息是预先计算的,因此Unity在阴影遮罩中存储的唯一阴影是从静态游戏对象投射到其他静态游戏对象上的阴影。这些阴影可能具有更平滑的边缘,提供比实时阴影贴图更好的质量,具体取决于光照贴图分辨率。由于每个混合光源在运行时保留其阴影遮罩通道贴图,因此动态游戏对象通过阴影贴图投射的阴影可与来自静态游戏对象的预计算阴影正确合成,从而避免诸如双阴影之类的不一致问题。
静态游戏对象的阴影与动态游戏对象的阴影之间唯一可察觉的差异是预计算的阴影遮罩与运行时阴影贴图的分辨率和过滤差异,此外,预计算的阴影支持各种形式的面光源,因此柔和阴影可能具有更逼真的半影。
Baked Indirect和Shadowmask的共同之处在于,直接光照总是实时计算得出并添加到光照贴图中存储的间接光照,因此需要光照方向的所有材质效果都能继续工作。如果为该光源启用了阴影,则动态游戏对象总是在阴影距离内通过阴影贴图在其他动态游戏对象上投射阴影。

Baked Indirect模式

Baked Indirect模式是由场景中所有混合光源共用的一种光照模式。要将Mixed Lighting设置为Baked Indirect,请打开Lighting窗口,单击Scene选项卡,导航至Mixed Lighting,然后将Lighting Mode设置为Baked Indirect。
对于设置为Baked Indirect模式的光源,Unity仅预先计算间接光照,不执行阴影预计算。阴影在阴影距离内是完全实时的。换句话说,Baked Indirect光照行为类似于带有额外间接光照但超出阴影距离后没有阴影的实时光源。您可以使用后期处理雾效之类的效果来遮挡超过该距离的缺失阴影。
适合使用Baked Indirect模式的一个很好的例子是,您想要在与走廊相连的房间内构建一个室内射击游戏或冒险游戏。此情况下的观察距离是有限的,因此可见的一切对象通常都应该在阴影距离内。此模式对于构建有雾的室外场景也很有用,因为您可以使用雾来隐藏远处缺失的阴影。
下表显示了使用Baked Indirect模式时静态和动态游戏对象如何投射和接受阴影:
Baked Indirect模式的优缺点:
鉴于Baked Indirect模式的性能要求,该模式非常适合以中端PC和高端移动设备为目标的构建。Baked Indirect模式最主要的优缺点如下:
优点
  • 提供与实时光照相同的视觉效果。
  • 为静态和动态游戏对象的所有组合提供实时阴影。
  • 提供间接光照。
缺点
  • 相对于其他混合光照模式具有更高的性能要求,因为它会将投射阴影的静态游戏对象渲染到阴影贴图中。
  • 不会渲染超出阴影距离的阴影。

Shadowmask模式

Shadowmask模式是由场景中所有混合光源共用的一种光照模式。要将Mixed lighting设置为Shadowmask,请打开Lighting 窗口,单击Scene选项卡,导航至Mixed Lighting,然后将Lighting Mode设置为Shadowmask。
此外,还需要从Quality Settings中选择所需的Shadowmask模式(Edit>Project Settings>Quality):
  • Shadowmask:投射阴影的静态游戏对象总是使用烘焙阴影。
  • Distance Shadowmask:Unity使用在阴影距离内使用实时阴影,而在超出此距离后使用烘焙阴影。

-Shadowmask

阴影遮罩是一种纹理,它与相应的光照贴图共享相同的UV布局和分辨率。它存储每个纹理像素的最多4个光源的遮挡信息,因为纹理在当前GPU上限制为最多4个通道。
Unity预先计算从静态游戏对象投射到其他静态游戏对象的阴影,并将它们存储在单独的阴影遮罩纹理中,最多达4个重叠光源。如果超过4个光源重叠,则多余光源会回退至烘焙光照。具体要回退至烘焙光照的光源视烘焙系统而定并在各烘焙之间保持一致,除非修改其中某个光源重叠。光照探针还会接收多达4个光源的相同信息。
光源重叠是独立于阴影接受对象计算的。因此,一个对象可受到全部来自同一个阴影遮罩/探针通道的10个不同混合光源的影响,只要这些光照包围体在空间中的任何点都不重叠即可。如果某些光源重叠,则使用更多通道。如果光源确实发生重叠而所有4个通道都已分配,则该光源将回退至完全烘焙。
在Shadowmask模式下无论阴影距离如何,静态游戏对象始终通过阴影遮罩接受其他静态游戏对象投射的阴影。它们也会接受动态游戏对象投射的阴影,但仅限于阴影距离内的阴影。动态游戏对象通过阴影贴图接受其他动态游戏对象投射在阴影距离内的阴影。它们也会通过光照探针接受静态游戏对象投射的阴影。阴影保真度取决于场景中的光照探针的密度以及在网格渲染器 上选择的光照探针模式。
Unity会自动合成来自静态和动态游戏对象的重叠阴影,因为阴影遮罩(其中保存静态游戏对象光照和阴影信息)和阴影贴图(其中保存动态游戏对象光照和阴影信息)仅编码遮挡信息。
适合使用Shadowmask模式的一个很好的例子是,您想要构建一个几乎完全静态的场景,使用镜面反射材质、柔和的烘焙阴影和动态阴影投射物,不要太靠近摄像机。另一个很好的例子是一个开放世界的场景,其中的烘焙阴影延伸到地平线,但没有动态光照,如白天/夜晚循环。
下表显示了使用Shadowmask模式时静态和动态游戏对象如何投射和接受阴影:
Shadowmask模式的优缺点:
鉴于Shadowmask模式的性能要求,该模式非常适合以中低端PC和移动设备为目标的构建。Shadowmask模式最主要的优缺点如下:
优点
  • 提供与实时光照相同的视觉效果。
  • 着色器中的一个纹理操作即可处理静态游戏对象之间的所有光照和阴影。
  • 自动合成静态和动态游戏对象的重叠阴影。
  • 具有中低级别性能要求,因为它不会将静态游戏对象渲染到阴影贴图中。
  • 提供间接光照。
缺点
  • 仅通过光照探针提供从静态游戏对象到动态游戏对象上的低分辨率阴影。
  • 最多只允许4个重叠的光源体积。
  • 增加了光照贴图纹理集的内存要求。
  • 增加了阴影遮罩纹理的内存要求。

-Distance Shadowmask

Distance Shadowmask是Shadowmask(阴影遮罩)光照模式的一个版本。该模式由场景中的所有混合光源共用。Distance Shadowmask模式是Shadowmask光照模式的一个版本,可提供从静态游戏对象投射到动态游戏对象的高质量阴影。
在阴影距离内,Unity会将动态和静态游戏对象渲染到阴影贴图中,可让静态游戏对象将清晰的阴影投射到动态游戏对象上。基于此原因,Distance Shadowmask模式相对于Shadowmask模式具有更高的性能要求,因为场景中的所有静态游戏对象都将渲染到阴影贴图中。
超出阴影距离静态游戏对象通过预先计算的阴影遮罩从其他静态游戏对象接受高分辨率阴影。动态游戏对象通过光照探针从静态游戏对象接受低分辨率的阴影。
适合使用Distance Shadowmask模式的一个很好的例子是,您想要构建一个开放的世界场景,其中的阴影延伸到地平线,复杂的静态网格在移动的角色上投射实时阴影。
下表显示了使用Distance Shadowmask模式时静态和动态游戏对象如何投射和接受阴影:
Distance Shadowmask模式的优缺点
鉴于Distance Shadowmask模式的性能要求,该模式非常适合以高端PC和最新款游戏主机为目标的构建。Distance Shadowmask模式最主要的优缺点如下:
优点
  • 提供与实时光照相同的视觉效果。
  • 提供从动态游戏对象投射到静态游戏对象上和从静态游戏对象投射到动态游戏对象上的实时阴影。
  • 着色器中的一个纹理操作即可处理静态游戏对象之间的所有光照和阴影。
  • 自动合成动态和静态阴影。
  • 提供间接光照。
缺点
  • 最多只允许4个重叠的光源体积
  • 增加了光照贴图纹理集的内存要求。
  • 增加了阴影遮罩纹理的内存要求。
  • 增加了性能要求,因为Unity会将光照和阴影从静态游戏对象渲染到阴影贴图中。

Subtractive模式

要将Mixed Lighting设置为Subtractive,请打开Lighting窗口,单击Scene选项卡,导航至Mixed Lighting,然后将Lighting Mode设置为Subtractive。
Subtractive是唯一将直接光照烘焙到光照贴图中并丢弃Unity用于在其他混合光照模式下合成动态和静态阴影的信息的混合光照模式。由于光照已烘焙到光照贴图中,因此Unity无法在运行时执行任何直接光照计算。
在 Subtractive 模式下静态游戏对象根本不显示混合光源中的任何镜面高光或光泽高光。除了主方向光,它们也不能接受动态游戏对象投射的任何阴影。动态游戏对象接受实时阴影并支持光泽反射。
在Subtractive模式下,主方向光(通常为太阳)是唯一将动态游戏对象的实时阴影投射到静态游戏对象上的光源。从静态游戏对象投射到其他静态游戏对象的阴影将烘焙到光照贴图中,即使对于主光源也是如此,因此Unity无法保证烘焙阴影和实时阴影的正确合成。因此,Subtractive模式有一个Realtime Shadow Color字段。Unity在着色器中使用此颜色将实时阴影与烘焙阴影进行合成。为此,它会减少光照贴图在动态游戏对象投射的阴影区域中的效果。因为引擎不能预先确定正确值,所以如何选择适用于给定场景的值取决于您自己的审美选择。
适合使用Subtractive模式的一个很好的例子是,您想要构建一个具有室外关卡和极少数动态游戏对象的卡通风格 (cel-shaded) 游戏。
下表显示了使用Subtractive模式时静态和动态游戏对象如何投射和接受阴影:
Subtractive模式的优缺点
鉴于Subtractive模式的性能要求,该模式非常适合以低端移动设备为目标的构建。Subtractive模式最主要的优缺点如下:
优点
  • 在光照贴图中的静态游戏对象之间提供高质量阴影,无需额外的性能要求。
  • 着色器中的一个纹理操作即可处理静态游戏对象之间的所有光照和阴影。
  • 提供间接光照。
缺点
  • 不提供实时直接光照,因此不提供镜面反射光照。
  • 除了一个方向光(主光源)外,不会在静态游戏对象上提供动态阴影。
  • 仅通过光照探针提供从静态游戏对象到动态游戏对象上的低分辨率阴影。
  • 提供不准确的动态和静态阴影合成。
  • 增加了光照贴图纹理集的内存要求(与无光照贴图的情况下相比)。
Tags:
尹煜
北京宏宇航天技术有限公司Unity工程师 - Programmer
28
Comments