【Unity】官方文档学习-光照系统

目录

1 前言

2 光照介绍

2.1 直接光与间接光

2.2 实时光照与烘焙光照

2.3 全局光照

3 光源

3.1 Directional Light

3.1.1 Color

3.1.2 Mode

3.1.3 Intensity

3.1.4 Indirect Multiplier

3.1.5 Shadow Type

3.1.6 Baked Shadow Angle

3.1.7 Realtime Shadows

3.1.7.1 Strength

3.1.7.2 Resolution

3.1.7.3 Bias

3.1.7.4 Normal Bias

3.1.7.5 Near Plane

3.1.8 Cookie

3.1.9 Draw Halo

3.1.10 Flare

3.1.11 Render Mode

3.1.12 Culling Mask

3.2 Point Light

3.2.1 Range

3.2.2 Baked Shadow Radius

3.3 Spot Light

3.3.1 Spot Angle

3.4 Area Light

3.5 注意点

3.6 光照模式

3.6.1 Realtime

3.6.2 Baked

3.6.3 Mixed

3.7 Cookies

3.7.1 启用和禁用Baked Cookies

3.7.2 为内置渲染管线创建Cookie

3.8 发光材质

3.8.1 演示

3.9 环境光

4 阴影

4.1 阴影映射

4.1.1 阴影映射是如何工作的

4.1.2 阴影贴图分辨率

4.1.3 替换阴影贴图分辨率

4.2 阴影配置项

4.3 阴影距离

4.3.1 设置阴影距离

4.3.2 减少闪烁阴影

4.3.2 阴影距离与阴影遮罩光照模式

4.4 阴影层叠

4.4.1 透视混叠

4.4.2 阴影层叠原理

4.4.3 使用阴影层叠

4.5 阴影问题解决方案

4.5.1 阴影性能

4.5.2 阴影暗斑

4.5.3 光偏移设置

4.5.4 阴影平坠

4.5.5 阴影不显示

5 全局光照

5.1 让物体参与GI

5.2 实时GI

5.2.1 演示

5.3 烘焙GI

5.3.1 Mixed

5.3.2 Mixed演示

5.3.3 Baked

5.3.4 Baked演示

5.4 Lighting窗口

5.4.1 相关 API

5.4.2 内部包含的窗口

5.4.3 Scene

5.4.3.1 Lighting Settings

5.4.3.2 Realtime Lighting

5.4.3.3 Mixed Lighting

5.4.3.4 Lightmapping Settings

5.4.3.5 Workflow Settings

5.4.4 Environment

5.4.4.1 Environment

5.4.4.2 Other Settings

5.4.5 Realtime Lightmaps

5.4.6 Baked Lightmaps

5.4.7 Probe Volumes

5.4.8 Control Area

6 光照设置资源

6.1 创建Asset文件

6.2 将Asset设置给场景

6.3 查看和编辑Asset的属性

6.4 默认LightingSettings数据

6.5 属性介绍

6.6 Lighting Mode

6.6.1 Baked Indirect

6.6.1.1 渲染管线支持

6.6.1.2 混合光行为

6.6.1.3 阴影与运行时性能

6.6.1.4 运行是改变光属性

6.6.2 Shadowmask

6.6.2.1 渲染管线支持

6.6.2.2 Shadowmask质量设置

6.6.2.3 混合光行为

6.6.2.4 阴影与运行时性能

6.6.2.5 阴影遮罩实现详细信息

6.6.3 Subtractive

6.6.3.1 渲染管线支持

6.6.3.2混合光行为

6.6.3.3 更改阴影颜色

6.6.3.4 主方向光

7 Light Explorer窗口

7.1 窗口介绍

7.2 窗口扩展

7.2.1 扩展方法

7.2.2 有用的类和方法

8 光照映射

8.1 Progressive Lightmapper

8.1.1 CPU、GPU Progressive Lightmapper

8.1.2 渲染管线支持

8.1.3 平台兼容性

8.1.4 设置Progressive Lightmapper

8.1.5 高级过滤设置

8.1.6 统计信息

8.1.7 ETA

8.2 Progressive GPU Lightmapper

8.2.1 硬件和软件要求

8.2.2 性能

8.2.3 防止因光照贴图器tiling引起的烘烤速度减慢

8.2.4 特定平台限制

8.2.5 如何优化烘焙速度

8.2.6 配置GPU的选择

8.3 光照映射:入门

8.4 预览光照映射

8.5 Lightmap Parameters Asset

8.5.1 创建

8.5.2 属性

8.5.2.1 Realtime Global Illumination

8.5.2.2 Baked Global Illimination

8.5.2.3 Baked Tags: Details

8.5.3 Baked AO

8.5.4 分配Lightmap Parameters Asset

8.5.4.1 分配给场景

8.5.4.2 分配给游戏对象

8.6 光照贴图模式

8.6.1 模式

8.6.2 性能问题

8.6.3 设置光照贴图的模式

8.6.4 附加场景时的注意点

8.7 环境光遮挡

8.7.1 烘焙环境光遮挡

8.7.2 实时环境光遮挡

8.7.3 其他资源

8.8 光照贴图:技术信息

8.8.1 编码方案

8.8.2 HDR光照贴图支持

8.8.3 高质量(BC6H)光照贴图的优点

8.8.4 预计算实时全局光照 (GI)

8.9 光照映射与着色器

8.9.1 The Meta Pass

8.9.2 带有Meta Pass的着色器实例

8.9.3 Meta Pass 技术信息

8.9.4 自定义RGB透明度

8.10 光照贴图UVs

8.10.1 介绍

8.10.1.1 Baked lightmap UVs

8.10.1.2 Real-time lightmap UVs

8.10.1.3 Unity如何计算real-time lightmap UVs

8.10.2 生成光照贴图 UV

8.10.2.1 如何提供自己的光照贴图UVs

8.10.2.2 如何自动生成光照贴图UVs

8.10.2.3 自动生成光照贴图UVs问题解决

8.10.3 可视化光照贴图UVs

8.10.4 解决光照贴图UV重叠

8.10.4.1 识别

8.10.4.2 解决方案

8.11 光照贴图接缝缝合

8.11.1 接缝缝合的局限性

8.11.2 使用接缝缝合

8.12 自定义衰减

9 Enlighten实时全局光照

9.1 渲染管线支持

9.2 何时使用

9.3 使用

9.4 如何工作的

9.5 光照探针与实时GI

9.6 阴影与实时GI

9.7 性能注意事项

9.8 优化实时GI

9.9 LOD和实时GI

10 光照探针

10.1 光照探针技术信息

10.2 Light Probe Group组件

10.2.1 创建

10.2.2 组件属性

10.2.3 案例

10.2.4 Ringing现象

10.2.5 放置位置

10.2.6 体积问题

10.2.7 移动光源与光照探针

10.2.8 放置位置错误情况

10.3 脚本创建光照探针思路

10.4 MeshRenderer

10.5 场景加载

10.6 运行时移动光照探针

10.7 Light Probe Proxy Volume组件

10.7.1 组件使用前提

10.7.2 组件属性

10.7.3 案例

10.7.4 粒子系统样本着色器代码示例

10.7.5 硬件需求

11 反射探针

11.1 背景

11.2 工作原理

11.3 反射探针类型

11.3.1 Baked反射探针

11.3.1.1 特点

11.3.1.2 使用演示

11.3.2 Custom反射探针

11.3.2.1 特点

11.3.3 Realtime反射探针

11.3.3.1 特点

11.3.3.2 使用演示

11.4 反射探针的使用

11.4.1 默认反射探针

11.4.2 探针位置

11.4.3 重叠的作用范围

11.4.4 混合

11.4.4.1 Mesh Renderer(混合控制)

11.4.4.2 混合权值计算

11.5 高级反射探针特性

11.5.1 互反射

11.5.2 盒子投影

11.6 反射探针性能

11.6.1 通用优化

11.6.1.1 Resolution

11.6.1.2 Culling Mask

11.6.1.3 Texture compression

11.6.2 实时反射探针优化

11.6.2.1 Refresh Mode

11.6.2.2 Time Slicing

11.7 反射探针组件

11.7.1 概念

11.7.2 属性与渲染管线

11.7.3 属性

11.7.3.1 Type

11.7.3.2 Runtime settings

11.7.3.3 Cubemap capture settings

11.7.4 细节

12 预计算的光照数据

12.1 生成光照数据

12.1.1 生成数据

12.1.2 构建之前

12.2 光照数据Asset文件

12.2.1 默认Asset文件

12.3 全局光照缓存

12.3.1 清理GI缓存

13 调试光照的绘制模式

13.1 Lighting

13.1.1 Contributors / Receivers

13.1.2 Shadow Cascades

13.2 Global Illumination

13.2.1 Indirect (Realtime Global Illumination only)

13.2.2 Directionality

13.2.3 Albedo

13.2.4 Emissive

13.2.5 UV Charts

13.2.6 Systems (Realtime Global Illumination only)

13.2.7 Clustering (Realtime Global Illumination only)

13.2.8 Lit Clustering (Realtime Global Illumination only)

13.2.9 Texel Validity (Baked Global Illumination only)

13.2.10 UV Overlap (Baked Global Illumination only)

13.2.11 Lightmap indices (Baked Global Illumination only)

13.2.12 Light Overlap (Baked Global Illumination only)

13.2.13 Baked Lightmap (Baked Global Illumination only)

13.2.14 Shadowmask (Baked Global Illumination only)

13.3 光照可视化悬浮窗口参考

13.4 更多内容

14 后记


1 前言

        关于Unity光照系统的一个笔记,主要是对官方文档内容的学习,总结下就是“文档翻译+自己的注释”。Unity中文和英文我都看,基本是结合着搞的,有些中文官方翻译甚至都有问题,一点都不上心。毕竟是个人笔记,也没法保证内容100%的正确性,不过基本没问题,遇到不懂的地方可以结合官方文档看。

        虽然官方文档写得很烂,但不多不说里面的东西还是实在的。很多内容网上的教程是不会提的,但这些内容在文档中都会有提及,看了之后就会有原来如此的感觉。本身光照系统我是没打算看文档的,但教程内容缺乏,只能在文档中找内容看,发现了文档里包含了很多东西就转而直接看文档了。

        看官方文档时,个人觉得完整的看完还是有必要的。比如我在看文档的某一块时,常常有看不懂的时候,不知道这里说的是什么,理解上有歧义,没法确定,但随着继续看下去,可能在其他部分就能看到相关联的内容,进而解决了之前遗留的疑惑。有一种单个知识点分散到整个文档的感觉,这也说明了官方文档的内容实际并不是严格按照知识点划分的,很多时候一个知识点需要从多个部分来了解,最终汇总理解。

        另外,对于文中遇到的一些不懂的名词、给的链接,可以现在文中搜索下看看能不能搜到相关解释,前面也说了知识点是分散的,活用Ctrl+F。当然也可以用来在全文中查找相关内容的多个解释,比如文中介绍了一个属性,但描述简单令人难懂,这时候就可以全文搜索此属性名称,也许就可以在另一个小节中找到对其的详细解释了。

PS:

  1. 文档版本:Unity 6
  2. texel概念:纹理数组中的单个值,常常称为纹理单元,也叫纹素(纹理像素,texel)。

2 光照介绍

        Unity中的照明工作原理近似于光在现实世界中的行为。Unity使用详细的光线工作模型,来获得逼真的光线效果。厚实使用简化的模型来获得更具风格化的效果。

2.1 直接光与间接光

        直接光是发射出来的光,照射到物体表面一次,然后直接反射到传感器(例如,眼睛的视网膜或照相机)。间接光是指所有其他最终被反射到传感器中的光,包括多次照射物体表面反射的光和天空光。如图:

Unity可以计算直接光照,间接光照。具体光照技术的使用,取决于我们的项目配置。

2.2 实时光照与烘焙光照

        实时光照是Unity在运行时实时计算的光照。烘焙光照是Unity提前执行光照计算,并将结果存储为光照数据,然后在运行时使用。在Unity中,我们可以只使用其中一种方式,或混合使用两种方式。

2.3 全局光照

        全局光照(Global Illumination)是一组模拟直接光照、间接光照的基数,来提供逼真的光照效果。Unity有两个全局光照系统,包含了直接光照与间接光照。

  1. Baked Global Illumination系统由光照贴图(Lightmap)、光照探针(Light Probe)、反射探针(Reflection Probe)组成。我们可以使用Progressive Lightmapper(CPU或GPU)来执行烘焙操作。
  2. Real-time Global Illumination系统是Enlighten Realtime Global Illumination。

3 光源

        这里介绍的光源都是在Unity内置渲染管线下的光源。右键创建灯光,和创建Cube类似,就不细说了。Light组件:

通过第一个属性Type,可以选择四种类型光源:

  1. Directional(方向光)
  2. Point(点光)
  3. Spot(聚光灯)
  4. Area(区域光)

后面将分别介绍。在介绍时,前面介绍过的属性后面便不再介绍。

3.1 Directional Light

        方向光。方向光在许多方面的行为就像太阳一样,可以被认为是存在于无限远处的遥远光源。方向光没有任何可识别的光源位置,因此光照对象可以放置在场景中的任何地方。场景中的所有物体都可以被照亮,好像光线总是来自同一个方向。光与目标物体的距离没有定义,所以光不会因距离而减弱。

        默认情况下,每个新的Unity场景都包含一个方向光。我们可以删除此光源,创建一个新的光源。

3.1.1 Color

        调整光源颜色。

3.1.2 Mode

        光照模式。有三种模式可选:

  1. Realtime(实时)
  2. Baked(烘焙)
  3. Mixed(混合)

3.1.3 Intensity

        光照强度。

3.1.4 Indirect Multiplier

        间接光照强度。若此值低于1,则每次光照反弹的光线变得越暗;若高于1,则每次反弹的光线就越亮。

3.1.5 Shadow Type

        阴影类型。有三种,分别为:

  1. No Shadows(无阴影):即没有阴影,可以节省性能。
  2. Hard Shadows(硬阴影):硬阴影边缘存在锐利的形状,与软阴影相比其并不真实,但它只需要较少的处理,节省一些性能。
  3. Soft Shadows(软阴影):软阴影较为柔和、真实,但相对的也比较耗性能。

3.1.6 Baked Shadow Angle

        烘焙阴影角?如果Model设置为Baked或Mixed,类型设置为定向,Shadow Type设置为Soft Shadows时,此属性可用。此属性设置可以在阴影边缘添加一些人工软化,并使其看起来更自然。

3.1.7 Realtime Shadows

        在Model设置为Realtime或Mixed,Shadow Type设置为Hard Shadows或Soft Shadows时,此属性组可用。可使用这些属性来控制实时阴影渲染设置。

3.1.7.1 Strength

        控制光照投射的阴影的暗度,用0到1之间的值表示。默认设置为1,最暗。

3.1.7.2 Resolution

        控制阴影贴图的渲染分辨率。更高的分辨率增加了阴影的保真度,但需要更多的GPU时间和内存使用。

3.1.7.3 Bias

        控制阴影偏移位置,值范围0-2,用于调整阴影位置。默认值0.05。

3.1.7.4 Normal Bias

        控制阴影投射表面沿表面法线收缩的距离,定义为0到3之间的值,用于调整阴影位置。默认值0.4。

3.1.7.5 Near Plane

        在渲染阴影时,控制阴影与物体表面距离的参数,定义为0.1到10之间的值。这个值被限制在0.1个单位或光的范围属性的1%,以较低者为准。默认设置为0.2。

3.1.8 Cookie

        指定一个纹理蒙版,通过它投射阴影(例如,为光创建轮廓或图案照明)。即投射图案阴影。同时通过其下方的Size设置投影图案的大小。

3.1.9 Draw Halo

        绘制光环。若有Range属性时(点光、聚光灯才有),Range可以控制光环的大小。Halo是一个组件。

3.1.10 Flare

        可提供一个光晕(Flare)使用。Flare是一种asset资源。

3.1.11 Render Mode

        渲染方式。可以设置所选光源的渲染优先级,这会影响光照保真度和性能。可选方式:

  1. Auto:在运行时确定渲染方法,具体取决于附近光源的亮度和当前项目设置中的Quality是如何设置的。
  2. Important:光线总是以每像素的质量渲染(像素光)。只对最明显的视觉效果使用重要模式(例如,玩家汽车的前灯)。效果好,吃性能。
  3. No Important:带你观点光源以快速、顶点/对象模式进行渲染(顶点光)。

3.1.12 Culling Mask

        可设置哪些层下的物体是否会被此光源光照影响。选中的层是会受光照影响的。

3.2 Point Light

        点光。由一点向四周发射光线,比如“火把”、“灯泡”。光照强度随距离光源的远近而减小,在一定范围内达到零。光强与到光源距离的平方成反比。这被称为“平方反比定律”,与光在现实世界中的行为类似。

3.2.1 Range

        可设置点光源的光照范围,或者理解为光传播的距离。(此属性仅点光和聚光灯才有)

3.2.2 Baked Shadow Radius

        此属性只有在Type为Point、Spot,Mode为Baked、Mixed,Shadow Type为Soft Shadows时,才可用。此属性将在阴影边缘添加一些人工软化,使其看起来更自然。

3.3 Spot Light

        聚光灯。字面意思,从一个点往某一方向投射光。与点光类似,聚光灯也有自己特定的范围,是一个锥形区域,在此范围外光线将消失。光线在聚光灯锥的边缘也会减弱,角度的扩大可以增加圆锥体的宽度,并随之增加了这种褪色的大小,称为“半影(penumbra)”。

3.3.1 Spot Angle

        调整聚光灯锥底的角度(以度为单位)。

3.4 Area Light

        区域光。在场景中由矩形或圆形定义的光,在其表面均匀地向所有方向发射光,但只从矩形或圆形的一侧发射光。区域光提供的照明强度以与光源距离的平方成反比的速率衰减。不能用于实时运行,只能用于烘焙全局光照,需要使用“Baked Global Illumination”,全局光照后面会讲。

        因为一个区域光同时从几个不同的方向照亮一个物体,所以阴影比其他类型的光更柔和和微妙。我们可以用它来创建一个逼真的街灯或一排靠近玩家的灯。一个小的区域光可以模拟较小的光源(如室内照明),但效果比点光更逼真。

3.5 注意点

  • 如果我们创建一个带有Alpha通道的纹理,并设置到光源组件的Cookie属性上,那么Cookie就会从光源投射出来。Cookie的Alpha Mask可以调节光线的亮度,在光照表明产生明暗斑点,这可以为场景增加复杂性或氛围。
  • VertexLit着色器不能显示cookie或阴影。
  • 请注意,当使用正向渲染时,带有cookie的方向光的阴影是禁用的。在这种情况下,可以编写自定义着色器来启用阴影。更多细节见文档writing surface shaders

小提示:

  • 聚光灯可以非常有效地创造从窗户进来的光的效果。
  • 低强度点光可以很好地为场景提供深度。
  • 为了获得最佳性能,可以考虑使用VertexLit着色器。这个着色器只做每个顶点的光照,在低端卡上提供更高的吞吐量。不过一般是不建议使用此着色器,老着色器了。

3.6 光照模式

        光照模式分为三种:Realtime、Baked、Mixed。

3.6.1 Realtime

        此模式为实时光。Unity在运行时执行实时灯光的照明计算,每帧一次。我们可以在运行时更改实时灯光的属性,以创建诸如灯泡闪烁或火炬通过黑暗房间的效果。实时灯光通常用于在角色或可移动的几何体上照明和投射阴影。

实时光行为:

  • 实时灯光投射阴影到阴影距离(Shadow Distance)。
  • 默认情况下,实时灯光只向场景提供实时直接光照。如果你使用内置的渲染管道,并且在你的项目中启用了Realtime Global Illumination(全局光照部分的内容),实时光照也会为场景提供实时的间接光照。

实时光限制:

  • 实时光耗费性能,尤其在复杂场景。
  • 因为实时灯光在默认情况下只为场景提供直接光照,所以阴影看起来完全是黑色的,没有任何间接光照效果,例如颜色反弹。这可能会导致场景中的灯光不真实。

3.6.2 Baked

        此模式为烘焙光。Unity在编辑器中执行烘焙灯光的计算,并将结果作为光照数据保存到磁盘上,这个过程叫做烘焙。在运行时,Unity加载烘焙的光照数据,并使用它来照亮场景。因为复杂的计算是提前完成的,所以烘焙光在运行时减少了阴影成本,并减少了阴影的渲染成本。烘焙光照对于运行时不会改变的东西很有用,比如风景。

烘焙光行为:

  • Unity将直接光和间接光烘焙到光照贴图(lightmap)中。
  • Unity将直接光和间接光烘焙到光照探针(Light Probe)中。

烘焙光限制:

  • 在运行时,无法更改烘焙光的属性。
  • 烘焙光不会产生镜面照明(specular lighting)。
  • 动态物体无法使用烘焙光。

        注意,如果我们禁用Baked Global Illumination,再强制执行烘焙行为,那么些设置为Baked、Mixed模式的灯光将像将它们的模式设置为实时一样。当这种情况发生时,Unity会在Light组件上显示一个警告。

3.6.3 Mixed

        此模式为混合光。混合灯光结合了实时光和烘焙光。拥有实时的直接光、烘焙的间接光。可以实现动态阴影与来自同一光源的烘焙光照的结合。

混合光行为:

  • 场景中所有混合光的行为取决于Lighting window中的Lighting Mode设置。不同选项的设置具有非常不同的性能特征,以及不同的视觉保真度。
  • 可以在运行时改变混合光,这将会更新实时光照的部分,所以要注意可能产生的异常视觉效果出现。

混合光限制:

  • 混合光的性能成本根据Lighting Mode的不同而有很大的区别。其涉及一部分的实时光计算,一部分的烘焙光计算,一个占运算时间,一个占内存空间,所以使用时要权衡性能。

3.7 Cookies

        Cookie是一个蒙版,我们把它放在一个光源上,可以通过改变光的外观和强度来创建一个具有特定形状或颜色的阴影。Cookie是一种模拟复杂灯光效果的有效方法,对运行时性能的影响最小或没有影响。可以用Cookie模拟的效果包括焦散、柔和阴影和光线形状。

        Cookie在Light组件的Cookie属性上设置。

        Cookie可能支持不同的特性,这取决于我们使用的渲染管线。

        使用Baked Light Cookies而实现的假焦散效果:

3.7.1 启用和禁用Baked Cookies

        对于在Unity 2020.1或更高版本中创建的项目,默认情况下,Progressive Lightmapper中的Baked灯光和Mixed灯光会启用Baked Cookies。对于在2020.1之前版本的Unity中创建的项目,默认情况下,Progressive Lightmapper中的Baked灯光和Mixed灯光的Baked Cookies是禁用的。这是为了提供向后兼容性。

        我们可以在编辑器设置窗口中设置在Progressive Lightmapper中,Cookies是否被用于Baked、Mixed灯光。如图:

3.7.2 为内置渲染管线创建Cookie

        使用内置渲染管道创建Cookie最方便的方法是创建一个灰度纹理,将该纹理导入Unity,然后让Unity将纹理的亮度转换为alpha。注意,在内置渲染管道中,Cookie只使用来自alpha通道的数据,这意味着我们可以为Cookie定义形状,但不能定义颜色。

首先要有张图像:

然后就将其拖拽到项目当中,设置其类型,如图:

创建一个场景,去掉天空盒(让场景暗一点),创建Spot Light,将图片拖到Cookie属性上,如图:

        PS:Cookie的像素不需要完全透明或不透明,但也可以包含介于两者之间的任何值。我们可以使用中间值来模拟光线路径中的灰尘或污垢,或模拟腐蚀性效应,例如由汽车前灯的脊线产生的效应。

3.8 发光材质

        发光材质(Emissive materials)可以让物体表面发光,并且相关属性可以在运行时修改,即可实时状态下使用发光材质。发射”是标准着色器的一个属性,它允许场景中的静态物体发光。默认情况下,“发射”的值被设置为零,这意味着使用标准着色器分配材质的物体不会发出光。

        发光材质没有范围值,但发射的光将再次以二次速率衰减。

        只有在Inspector面板中设置为Static(Contribute GI)才能接收到发射的光线。同样,也只有静态物体才能使用发光材质对场景造成光照影响,若是非静态,则自身发光但不会对场景造成影响。对于静态物体,若也想自身发光但不对场景造成影响,那么我们可以在材质的属性设置面板中设置来实现此效果,只需要将Global Illumination设置为None即可。发射材料只直接影响场景中的静态几何对象,如果需要动态或非静态几何对象来收到光照影响,则需要使用光照探针。

        像这样的自发光材料是创造霓虹灯或其他可见光源效果的有效方法。

3.8.1 演示

        首先创建一个材质,然后将其放到一个物体上,注意材质的属性,如图:

勾选Emission,材质即可变为发光材质。Color处可以修改光的颜色、强度。Global Illumination修改全局光照类型,有Realtime、Baked、None。None前面说过了,就是自身发光但不影响周围环境;Realtime需要配合“实时全局光照”使用,Baked需要配合“烘焙全局光照”使用(全局光照(Global Illumination)部分的内容,可以之后再单独了解)。这里我们以Realtime来演示:

3.9 环境光

        环境光(Ambient light),也被称为漫射环境光,是存在于场景周围的光,并不来自任何特定的源对象。它可以对场景的整体外观和亮度做出重要贡献。环境光在很多情况下都是很有用的,这取决于我们项目的艺术风格。比如卡通风格,可能就需要明亮的环境光,甚至照明效果也是手绘到纹理中的。另外,也可以通过环境光来调整整个场景的亮度,而不需要调整其他灯光。

        环境光可以在Lighting面板中设置。另外,环境光也是会被“实时全局光照”与“烘焙全局光照”系统所影响的。

4 阴影

4.1 阴影映射

        Unity使用一种称为阴影映射(shadow mapping)的技术来渲染实时阴影。

4.1.1 阴影映射是如何工作的

        阴影映射使用称为阴影贴图(shadow maps)的纹理。阴影贴图类似于深度纹理。光源生成阴影贴图的方式与相机生成深度纹理的方式类似。可以想象一个相机与光源在同一位置,那么相机看不到的场景区域就是光线无法到达的场景区域,因此,他们处于阴影之中。

        Unity在阴影贴图中填充了光线在达到物体表明之前所走过的距离信息,然后对阴影地图进行采样,以计算光线击中的GameObjects的实时阴影。

4.1.2 阴影贴图分辨率

        首先,确定光可以照亮的屏幕视图的面积。对于方向光,可以照亮整个屏幕。对于聚光灯和点光,区域是光的范围的形状在屏幕上的投影(锥形、圆形)。投影形状在屏幕上具有以像素为单位的宽度和高度,然后取这两个值中较大的那个,这个值被称为光的像素尺寸。

        然后,确定阴影质量的相乘系数。这个数值在Unity的Quality窗口中的Shadow Resolution属性这里设置(Project Settings→Quality→Shadows→Shadow Resolution)。可设置选项如下:

  • Very High: 1.0
  • High: 0.5
  • Medium: 0.25
  • Low: 0.125

最后,执行计算,并将结果裁剪到最大分辨率范围内。计算:


 

光照类型 计算公式 最大分辨率(像素单位)
方向光 NextPowerOfTwo (pixel size * shadow quality multiplier * 3.8) 当阴影分辨率是非常高的质量或GPU有512MB或更多的RAM,则分辨率设置为4096×4096,否则为2048×2048。
聚光灯 NextPowerOfTwo (pixel size * shadow quality multiplier * 2.0) 如果GPU的内存大于等于512MB,则为2048 * 2048,否则为1024 * 1024 。
点光  NextPowerOfTwo (pixel size * shadow quality multiplier * 1.0) 如果GPU的内存大于等于512MB,则为1024 * 1024,否则为512 * 512。

点光相比其他类型在尺寸上限制得更小,因为其使用Cubemap来绘制阴影。这意味着有相同分辨率的Cubemap的6个面会同时存储在显存中,另外,其渲染成本也是非常高的,因为潜在的阴影可能需要渲染到Cubemap的6个面中。

4.1.3 替换阴影贴图分辨率

        在内置渲染管道中,我们可以通过将Light.shadowCustomResolution属性设置为一个大于零的值来设置灯光阴影贴图的分辨率。当这个值大于0时,Unity对所有的光源类型执行如下计算:NextPowerOfTwo (shadowCustomResolution)。其会根据Light类型与硬件情况计算,然后裁剪到最大分辨率范围内。

PS:我记得在灯光Inspector面板里也可以设置阴影质量相乘系数,可以选择使用质量面板的设置,也可以自己选择低高四个档位。

4.2 阴影配置项

        在Light组件中可以设置灯光模式为Realtime、Baked、Mixed,对应的引用也会采用相对的模式。什么样的光产生什么样的阴影,实时光产生实时阴影,烘焙光产生烘焙阴影。具体会在全局光照里有讲到。

        Mesh Renderer组件中有Cast Shadows和Receive Shadows属性,可分别设置物体本身是否可以投射阴影(有影子),以及是否接收阴影(身上可被投射别的物体的阴影)。

        Cast Shadows的选项有:Off、On、Two Sided、Shadows Only。Off是关闭阴影投射;On是打开;Two Sided允许阴影投射到表面的任何一侧,因此为了投射阴影,背面剔除此时将被忽略;Shadows Only会使物体不可见,但阴影依旧存在。

4.3 阴影距离

        阴影距离(Shadow Distance)用于确定从相机到Unity渲染实时阴影的最远距离,超过此距离就不渲染了。游戏对象离摄像机越远,其阴影越不明显,这是因为阴影在屏幕上显得比较小,而且远处的游戏对象通常不太会被关注。我们可以利用这个特点来降低渲染对性能的消耗,只需要禁用远距离游戏对象的实时阴影即可。另外,场景通常没有远处的阴影会看起来更好。

        如果当前相机的近平面(Camera Far Plane)比阴影距离更近一些,则Unity会使用近平面距离,而非阴影距离。此时只有在近平面距离内的阴影才能被渲染。

        超出阴影距离而没有被渲染的阴影,其缺失会比较显眼,我们可以使用相关视觉效果来遮掩它们,比如雾。

4.3.1 设置阴影距离

        在使用Unity内置渲染管线的情况下,我们可以在项目的质量设置中设置阴影距离。如图:

        在通用渲染管线( URP)中,在通用渲染管线的Asset中来设置阴影距离。

        在高清渲染管线(HDRP)中,需要为每个Volume设置阴影距离。

4.3.2 减少闪烁阴影

        如果阴影距离相机较远,则它们可能会出现闪烁的情况。更多信息参考 Understanding the View Frustum

        如果阴影比世界空间原点离相机更近,则启用相机相对剔除。Unity使用相机作为阴影计算的相对位置,而不是世界空间原点,这减少了闪烁。

        要启用相机相对剔除,在下图中位置设置:

4.3.2 阴影距离与阴影遮罩光照模式

        若在启用Baked Global Illimination后,选择了阴影遮罩(Shadowmask Lighting)模式,Unity可以使用光照探针或一个阴影遮罩纹理来渲染阴影距离以外的混合(Mixed)光阴影。我们可以配置Unity如何在阴影距离之外渲染阴影。

4.4 阴影层叠

        阴影层叠(Shadow Cascades)有助于解决透视混叠(perspective aliasing)问题:当方向光的实时阴影靠近相机时,它们会出现像素化。阴影层叠只适用于方向光。

4.4.1 透视混叠

        一个方向光通常模拟阳光,一个单一的方向光可以照亮整个场景。这意味着它的阴影贴图覆盖了场景的很大一部分,这可能导致一个叫做透视混叠的问题。透视混叠意味着靠近相机的阴影贴图像素相比于那些远离相机的看起来更大、更厚。

如图,远处(A)的阴影具有适当的分辨率,而靠近相机(B)的阴影显示透视混叠。

        由于阴影贴图的不同区域被相机视角不成比例地缩放,因此会出现透视混叠。光线的阴影贴图只需要覆盖场景中相机可见的部分,这是由相机的视锥体(view frustum)定义的。比如,方向光直接从上方照下,产生一个阴影,如下图所示,我们就可以看到视椎体和阴影贴图之间的关系。

在这个简化的例子中,视椎体的远端被20个像素的阴影贴图覆盖,而近端仅被4个像素覆盖。然而,两端在屏幕上显示的尺寸相同(可以自己在场景里对着地面的线框试下)。结果是,对于靠近相机的阴影区域,其贴图的分辨率实际上要低得多。

4.4.2 阴影层叠原理

        当我们使用Soft Shadows,并使用一个高分辨率的阴影贴图时,透视混叠实际是不明显的。但是这种处理方式在渲染时将会占用更多的内存和带宽。

        当使用阴影层叠时,Unity将会根据距离相机的距离将视椎体划分为两个区域。在相机近端区域,使用一个单独的尺寸被缩放变小的阴影贴图(尺寸缩小,但分辨率不变)。这种阴影贴图尺寸的阶段性缩减,被称为级联阴影贴图(cascaded shadow maps),有时也被称为Parallel Split Shadow Maps。

如图所示,靠近相机区域使用了一个单独的阴影贴图,尺寸缩小,分辨率不变(总感觉说分辨率不变有歧义...)。

4.4.3 使用阴影层叠

        在项目中,当我们使用音阴影层叠时,我们可以旋转使用0、2、4层叠。Unity会计算各层叠在相机视椎体内的位置。使用的层叠越多,阴影受透视混叠的影响就越小。但层叠越多,渲染开销也就越大,不过,相比在整个阴影中使用高分辨率的贴图,层叠的开销仍然要小。

        若使用内置渲染管线,则在项目的质量设置窗口中配置每个质量级别的阴影层叠。如图:

        若使用通用渲染管线(URP),则在渲染管线的Asset文件中设置阴影层叠。

        若使用高清渲染管线(HDRP),则需要为每个Volume设置阴影层叠。

4.5 阴影问题解决方案

4.5.1 阴影性能

  • 实时阴影具有相当高的渲染开销,任何可能投射阴影的游戏对象必须首先渲染到阴影贴图中,然后该贴图将用于渲染可能接收阴影的对象。
  • Soft shadows比Hard Shadows有更大的渲染开销,但这只对GPU有较大影响,对CPU影响较小。
  • 如果为复杂的几何体渲染实时阴影的成本过高,可以考虑使用低LOD网格。
  • 当角色阴影性能开销较大时,还可以考虑将一个模糊的纹理应用到一个简单的Mesh或Quad上,然后将其放到角色下当做阴影,或者使用自定义的shader来创建阴影。

4.5.2 阴影暗斑

        被光直接照射的表面有时看起来部分处于阴影中。这是因为应该准确地在阴影贴图中指定距离上的像素,其有时被计算到更远的距离了(这是使用阴影过滤或阴影贴图使用低分辨率图像造成的)。其结果是,一些像素处于阴影之中,而它们本应是被照亮的,产生了一种被称为“阴影暗斑(shadow acne)”的视觉效果。如图,在低分辨率阴影情况下,物体表明出现了一些类似波纹的东西。

4.5.3 光偏移设置

        为了预防阴影暗斑,我们可以调整光偏移设置(Light Bias Settings)。

        我们可以在阴影贴图中增加一个距离偏移,以确保边缘上的像素通过比较,或者我们可以沿着它的法线(normals)插入一点几何偏移。

        在内置渲染管道中,当启用阴影时,我们可以在Light Inspector窗口中使用Bias和Normal Bias属性设置这些值。

        不要将Bias值设置得太高,因为在投射它的GameObject附近的阴影区域有时会被错误地照亮。这导致了一个不连贯的阴影,使GameObject看起来好像在地面上飞行。如图:

同样地,将Normal Bias值设置得太高会使GameObject的阴影显得太窄,有种变小的感觉:

        在某些情况下,Normal Bias会导致一种不必要的效果,称为“光出血(light bleeding)”,即光线从附近的几何图形中渗出到应该阴影的区域。一个潜在的解决方案是将GameObject的Mesh Renderer组件上的Cast Shadows属性更改为Two sides。这有时会有所帮助,尽管它在渲染场景时可能会占用更多资源并增加性能开销。

        关于Bias的值,一般需要合理的调整,以确保不发生不想要的效果,通常用眼睛来衡量正确的值比试图计算它更容易。

        比如,如果设置不合理的偏移值(包括Bias、Normal Bias),就会导致如下情况:

如图,阴影中出现了一块空洞。而其本来的模样是这样的:

4.5.4 阴影平坠

        为进一步预防阴影暗斑,我们正在使用一种被称为阴影平坠(Shadow pancaking)。这个想法是为了减少沿光照方向渲染阴影贴图时使用的光照空间范围。这样可以提高阴影贴图的精度,减少阴影暗斑。

        阴影平坠原理介绍,原理图:

在上图中:

  • 浅蓝色的圆圈代表阴影投射者,即产生阴影的物体。
  • 深蓝色矩形代表原始光照空间
  • 绿线表示优化后的近平面(将视锥体中不可见的所有阴影投射物排除在外)

将这些阴影投射物钳制在优化空间的近裁剪面(在顶点着色器中)。请注意,虽然这通常很有效,但对于穿过近裁剪面的大型三角形,这会带来瑕疵,如图:

在此情况下,只有蓝色三角形的一个顶点位于近裁剪面背后并被钳制到此处(由这个就看懂了,这个“钳制”含义:图中右侧可看到三角形顶点被强行往近裁剪面移动了)。但是,这会改变三角形的形状,并可能产生不正确的阴影。

        我们可以从Quality窗口中调整 Shadow Near Plane Offset 属性以避免发生此问题。这将拉回近裁剪面(即图中往下移动)。但是,如果将此值设置得非常高,最终会引入阴影暗斑,因为它会提高阴影贴图需要在光照方向上覆盖的范围(即图中值越大近裁剪面越往下走)。或者,我们也可以拆分有问题的阴影投射三角形。

4.5.5 阴影不显示

        如果我们发现一个或多个对象未投射阴影,则可以从以下几点来检查:

  • 检查Quality窗口,看看对应的质量级别,是否启用了阴影。
  • 检查对象的Mesh Renderer中Receive Shadows和Cast Shadows属性是否启用。
  • 只有不透明对象才投射和接受阴影,因此使用内置透明着色器或粒子着色器的对象既不会投射也不会接受阴影。通常,我们可以使用透明镂空着色器代替具有“间隙”的对象,例如栅栏、植被等。自定义着色器必须采用像素光照并使用几何渲染队列
  • 使用顶点光照 (VertexLit) 着色器的对象不能接受阴影,但可投射阴影。
  • 如果游戏对象的材质具有“无光照”类型的着色器,Unity 无法为这些游戏对象计算阴影。只有材质的着色器支持光照时,Unity 才能为材质计算阴影。
  • 在内置渲染管道中,使用正向渲染路径(Forward Rendering Path),一些着色器只允许最亮的方向光投射阴影(特别是,这发生在Unity的内置着色器4.x版本)。如果我们想有一个以上的阴影投射光,那么我们应该使用延迟着色(Deferred Shading)渲染路径。我们可以通过使用fullforwardshadows表面着色器指令来启用我们自己的着色器来支持“完全阴影(full shadows)”。

5 全局光照

        全局光照(Global Illumination,GI),考虑场景中直接来自光源的光照,同时又考虑经过场景中其他物体反射后的光照的一种渲染技术。GI可以有效地增强场景的真实感。毫无疑问,实时性的GI是非常耗费性能的,所以通常会选择进行预先计算。Unity中,GI有两种,第一种是实时GI(Enlighten Realtime Global Illumination),第二种是烘焙GI(Baked Global Illumination)。

  • 实时GI:可以对静态物体(参与GI的物体,本身会变为静态状态)进行光线反射部分数据的预计算(光照贴图),在运行时,支持实时光线的改变(也会改变光照贴图)。但这样就会存在一定的延迟,不适合快速变化的灯光。所属系统:Enlighten Realtime Global Illumination系统。
  • 烘焙GI:将全局光照信息提前计算,并烘焙到一张LightMap贴图(光照贴图)中不必实时计算,以此来节省性能资源。但相对的,光照就定死位置了,无法再发生变化(光照贴图无法改变)。烘焙GI有两种模式,一种是Baked模式只有烘焙光,另一种Mixed模式将包含烘焙光和实时光。所属系统:Lightmapper系统。

        好了,到这里我们就知道了三种情况的光照,一种是Unity默认光照,一种是实时GI,一种是烘焙GI(两种模式)。

5.1 让物体参与GI

        想要使用GI,首先要让物体能够参与到GI中,那么如何设置呢?如图:

        选中物体,将其设置为静态,这里实际只需勾选图中的“Contribute GI”即可,勾选后物体变变为静态的,无法在运行时移动了(对于非静态物体也可以使用光照探针进行间接光处理,这里先不讲),但同时也可以参与GI了。

        或者也可以在物体的MeshRender组件中设置,勾选“Contribute Global Illumination”即可,这个与我们设置的“Contribute GI”是会同步改变的,勾选一个,另一个就会自动勾选。

5.2 实时GI

        实时计算直接光、间接光,生成的光照贴图辅助计算间接光。Window→Rendering→Lighting,打开Lighting面板。勾选“Realtime Global Illumination”,表示在生成光照数据时,生成实时光照数据。之后选择我们的光源对象,将其Mode设置为Realtime。

然后点击Lighting面板的Generate Lighting即可(一般也会将这个操作称为“烘焙”),生成光照贴图。

PS:注意点击按钮右侧的倒三角,可在下拉列表中清除已经生成的光照数据。

之后我们可以在“Realtime Lightmaps”面板中看到生成的光照贴图,此光照贴图会随着光源的改变而改变,这里就不再演示了,可以在打开此窗口的同时,试一试调整光线颜色。

另外,还要注意生成的光照数据文件:

一般会自动生成一个同场景名的文件夹,来存放生成的数据。

5.2.1 演示

        这里还是演示下吧。首先搭建一个全黑场景,涉及相机、环境光设置,如图:

这样以来,整个场景就暗下来了,这里我搭建了一个小房子(给了材质改了个颜色),外加一个方向光,修改为Realtime模式,整体场景如图:

接下来使用实时GI:

可以看到,在烘焙完实时GI后,房子内的细节瞬间就有了。然后我开始旋转光源,由于直接光、间接光都是实时的,可以看到阴影、房子内的细节都会随着光源的旋转而变化。

PS:

  1. 旋转光源,有时候会出现间接光变化不及时的问题,这是正常的,因为实时间接光较耗费性能,计算速度过慢导致有时候变化不及时。
  2. 还有一种就是旋转光源,但间接光不变化,不变化就是不变化。这就是BUG,重启Unity就好。这BUG搞了两个多小时没找出问题,重启解决了,感觉可能跟GI缓存有关,但我又没证据。

5.3 烘焙GI

        这里我们需要勾选“Baked Global Illumination”,表示在生成光照数据时,生成烘焙光照数据。这里若不需要实时GI的话可以取消“Realtime Global Illumination”的勾选,这里我们取消,方便案例说明。之后同样,我们需要去设置光源的Mode,不过这里有两种可选:Mixed、Baked。

5.3.1 Mixed

        光源Mode选择Mixed表示混合,即包含实时光与烘焙光。Lighting面板的Lighting Mode为默认的Shadowmask时(目前只讨论这个),我们点击“Generate Lighting”,只会生成间接光的烘焙光照数据,直接光此时为实时计算的,即实时光照。我们可以看下生成的光照数据:

即,无实时GI光照贴图。

即,有烘焙GI光照贴图。

Project中生成的光照数据文件。

5.3.2 Mixed演示

        场景搭建与实时GI演示里一样,这里使用mixed烘焙GI来看看效果,由于烘焙时间过长,这里直接展示烘焙好的场景:

如图所示,是已经烘焙好有细节的场景,由于直接光是实时的、间接光是定死的,所以随着光源的旋转可以看到阴影是实时变化的,但房子左侧地面上的光(间接光造成的)却没有变化,即使其侧已经没有光照了地面却依旧在发亮。实际内部细节也没有变化,这不过这里可能看不太清楚。

5.3.3 Baked

        光源Mode选择Mixed表示纯烘焙,即只包含烘焙光。Lighting面板的Lighting Mode为默认的Shadowmask时,我们点击“Generate Lighting”,会生成直接光间接光的烘焙光照数据。

5.3.4 Baked演示

        场景搭建与实时GI演示里一样,这里使用baked烘焙GI来看看效果,由于烘焙时间过长,这里直接展示烘焙好的场景:

如图所示,是已经烘焙好有细节的场景,由于直接光、间接光是定死的,所以随着光源的旋转,什么都没有变化,阴影不变,细节也不变。

5.4 Lighting窗口

        Lighting 窗口是 Unity 光照功能的主要控制点。使用 Lighting 窗口调整与场景中的光照有关的设置,并根据质量、烘焙时间和存储空间来优化预计算的光照数据。

5.4.1 相关 API

        可以使用 LightingSettingsLightmapping API,通过脚本执行 Lighting 窗口中提供的许多函数。

5.4.2 内部包含的窗口

  • Scene。
  • Environment。
  • Realtime Lightmaps。
  • Baked Lightmaps。
  • Probe Volumes,高清渲染管线(HDRP)独有。
  • Control Area,在Lighting窗口底部。

5.4.3 Scene

        此窗口中显示的信息是分配给当前激活场景的光照设置资源(Lighting Settings Asset)文件中的信息。如没有给当前激活场景分配此文件,则会显示默认光照设置(LightingSettings)对象的信息(一个内置的只读对象)。

5.4.3.1 Lighting Settings
  • Lighting Settings Assets:光照设置资源文件。光照设置就是此Lighting面板中的各种设置,设置的内容都会被记录到此属性上的资源文件中。我们可以在这里替换文件。我们也可以点击New按钮创建多个资源文件,分别存储不同的光照设置,点击Clone按钮可以复制当前资源文件。
5.4.3.2 Realtime Lighting

        本节包含了与 Enlighten Realtime Global Illumination系统相关的设置。

  • Realtime Global Illumination:勾选后,启用实时GI系统,在Generate Lighting时会生成实时光照数据。
  • Realtime Environment Lighting:勾选后,使用实时GI系统来计算、更新环境光。只有在“Baked Global Illimination”启用后才可设置,若没有启用,则此属性默认强制勾选。
  • Indirect Resolution:指定用于实时光照贴图的每个单元的纹理数。增加这个值可以提高光图质量,但也会增加渲染时间。
5.4.3.3 Mixed Lighting

本节包含在使用此Lighting Settings Asset的场景中影响Baked光和Mixed光行为的设置。

  • Baked Global Illumination:勾选后,启用烘焙GI系统,在Generate Lighting时会生成烘焙光照数据。
  • Lighting Mode:光照模式。可选项有Shadowmask、Baked Indirect、Subtractive。
    • Shadowmask:对所有Mixed模式的灯光使用此模式。提供实时直接照明,而间接光被烘烤成光照贴图和光照探针。这种模式结合了实时和烘烤阴影,效果较好。
    • Baked Indirect:对所有Mixed模式的灯光使用此模式。提供实时直接照明,而间接光被烘烤成光照贴图和光照探针。实时提供阴影。
    • Subtractive:Mixed模式的灯光为静态物体提供直接和间接照明。动态对象接收实时直接照明,并使用定向光投射阴影。性能最好,效果最差。
5.4.3.4 Lightmapping Settings
  • Lightmapper:光照映射器。选择使用什么来计算场景中的光照贴图。有CPU、GPU两种选择。

    • Progressive Updates:启用此设置可使渐进光照映射器将更改应用于 Scene 视图中当前可见的纹素,然后将更改应用于视图外的纹素。

    • Importance Sampling:启用此选项以使用多重重要性采样对环境进行采样。当生成lightmaps时,这通常会导致更快的收敛,但在某些低频环境中可能会导致嘈杂的结果。这在默认情况下是禁用的。

    • Direct Samples:这个设置控制CPU、GPU采样数量,这些采样将用于计算直接光照。只能设置为2的幂。最大值为2的30次方。

    • Indirect Samples:这个设置控制CPU、GPU采样数量,这些采样将用于计算间接光照。只能设置为2的幂。最大值为2的30次方。

    • Environment Samples:环境样本属性决定了Unity向天空盒发射的环境光线的总数,以直接收集光线。Unity根据上下文从光贴图纹理或光探针位置发射这些光线。默认值为256。更高的值可能会产生更平滑的结果,但代价是烘烤时间的增加。只能将滑块设置为2的幂,最小值为1,最大值为2048。在HDR天空盒的场景中,通常需要更多的样本来减少最终光图或探头中的噪点。包含明亮的奇点(如太阳)或具有显著对比度的高频细节(如背光云)的天空盒场景也受益于更高数量的样本。

    • Light Probe Sample Multiplier:控制多少采样用于光照探针,这里设置的是一个乘数,会影响最终所用采样数。更高的值提高光照探针的质量,但他们将需要更长的烘烤时间。要启用此功能,请转到Project Settings > Editor,并禁用“Use legacy Light Probe sample counts”。此项默认值为4。

    • Max Bounces:Lightmapper所包含的直接光的最大反射次数。默认值2,范围[0,100]。设置为10适用于大多数场景,高于10的值可能会导致烘焙时间明显延长。每次反弹都会增加烘焙场景所需的计算资源。对室内场景可使用较高的值,对室外场景和有许多明亮表面的场景可以使用较低的值。

    • Filtering:过滤。配置Progressive Lightmapper对光照贴图进行后处理的方式,以限制噪点。对于光照贴图的后处理,光照贴图被分成直接遮挡,间接遮挡和环境遮挡三种类型,Unity分别应用后处理,然后将它们组合成一个单一的光照贴图。直接:任何从光源直接到达传感器(通常是相机)的光。间接:任何从光源间接到达传感器的光。这通常适用于从其他游戏对象反射的光。环境遮挡:光照系统计算的任何环境光。可配置选项:

      • None:选择此选项,对光照贴图不进行后处理去噪。

      • Auto:使用平台相关的预设来对光照贴图进行后处理。如果开发机器满足运行OptiX (NVIDIA OptiX AI-Accelerated Denoiser)的要求,Progressive Lightmapper使用高斯滤波器去噪器,该滤波器对所有目标具有1 texel(纹理)半径。如果开发机器不能运行OptiX,则Progressive Lightmapper会退回到OpenImageDenoise。

      • Advanced:为每种类型的光照贴图目标手动配置选项。目标类型有直接遮挡、间接遮挡和环境遮挡。有关详细信息,请参阅

  • Lightmap Resolution:指定用于光照贴图的每个单元的纹理数。增加这个值可以提高光照贴图质量,但也会增加烘焙时间。注意,加倍这个值会导致texels的数量翻四倍,因为它决定了光照贴图的高度和宽度。

  • Lightmap Padding:决定在光照贴图中分离形状之间的分离度(以texel为单元)。

  • Max Lightmap Size:最大光照贴图尺寸。默认1024。

  • Lightmap Compression:光照贴图压缩级别。

  • Ambient Occlusion:控制烘焙环境遮挡中表面的相对亮度。这只适用于我们用来烘焙光照的光照映射器所计算的间接照明。如果启用此属性,将会提供额外的三个设置:最大距离,间接贡献,和直接贡献。对于所有三种设置,更高的值表示遮挡和完全照亮区域之间的对比度更大。(三个设置官方文档写得很清楚,这里就不写了)

  • Directional Mode:使光照贴图能够存储物体表面上每个点的主要入射光的特征信息。可选项:

    • Directional:在此模式下,Unity生成第二个光照贴图来存储入射光的主要方向。这使得漫射法线贴图材质可以与全局照明系统一起工作。着色器在渲染过程中对两种光照贴图纹理进行采样。因此,定向模式需要的显存大约是非定向模式的两倍,以存储额外的光照贴图数据。此选项在烘焙时将会耗费更多性能。在SM2.0硬件或使用GLES2.0时,方向光照贴图无法解码。

    • Non-directional:此模式光照贴图只包含一个纹理。因此,它们比Directional光照贴图需要更少的显存和存储空间,并且在着色器中解码速度更快。但这些优化降低了视觉质量。

  • Albedo Boost:指定Unity在表面之间反射的光量。取值范围为1 ~ 10。增加这个值将会把用于间接光计算的反照率值拉向白色。默认值1在物理上是准确的。

  • Indirect Intensity:决定存储在实时和烘焙光照贴图中的间接光的亮度。这是一个介于0和5之间的值。大于1的值增加了间接光的强度,小于1的值减少了间接光的强度。默认值为1。

  • Lightmap Parameters:此为一个资源对象,存储了与烘焙GI相关的设置值。编辑器提供了几个默认的光照贴图参数资源可供选择,我们也可以使用选项下拉框中的Create New选项创建自己的光照贴图参数资源。

5.4.3.5 Workflow Settings
  • GPU Baking Device:使用此属性更改 Unity 用于预计算光照数据的 GPU。

  • Light Probe Visualization:用于过滤哪些光照探针显示在 Scene 视图中。默认值为 Only Probes Used By Selection。三种可选项:

    • Only Probes Used By Selection:只有影响当前选择的光照探针才会显示在 Scene 视图中。

    • All Probes No Cells:所有光照探针都将显示在 Scene 视图中。

    • All Probes With Cells:所有光照探针都将显示在 Scene 视图中,还会显示用于光照探针数据插值的四面体。

    • None:任何光照探针都不显示在 Scene 视图中。

    • Display Weights:启用此复选框时,Unity 将从用于有效选择的光照探针到用于插值的四面体上的位置绘制一条线。这是一种调试探针插值和放置问题的方法。

    • Display Occlusion:启用此复选框时,如果 Lighting Mode 设置为 Shadowmask,则 Unity 将显示光照探针的遮挡数据。

    • Hightlight Invalid Cells:高亮不能被用于光照探针插值的无效四面体。

  • Recalculate Environment Lighting:重新计算环境光照。勾选后,如果没有生成预先计算的照明数据,Unity会使用SkyManager自动计算所有开放场景的环境照明。

5.4.4 Environment

包含相关当前场景的环境光照效果的设置。可配置内容取决于我们的项目使用的渲染管线。

5.4.4.1 Environment

Environment 部分包含与光照相关的设置和控件,这些设置和控件适用于当前场景中的环境光照,例如天空盒、漫射光照和反射。

  • Skybox Material:天空盒材质,它出现在场景中的所有其他对象后方,用于模拟天空或其他遥远的背景。使用此属性可选择要用于场景的天空盒。默认值是内置的默认天空盒 (Default Skybox)。

  • Sun Source:选择一个光源作为场景中的太阳。Unity使用这个光来模拟天空盒和场景中太阳的位置和强度的效果。如果你将此设置为None, Unity将场景中最亮的方向光视为太阳。若所选光源的渲染模式属性设置为不重要,则其不会影响天空盒。

  • Realtime Shadow Color:定义Unity在Subtractive照明模式下渲染实时阴影时使用的颜色。

  • Environment Lighting:此部分包含可影响当前场景中的环境光的相关设置。

    • Source:定义场景中环境光的光源颜色。默认值为Skybox。可选有Skybox、Gradient、Color。Skybox:使用Skybox Material中设置的天空盒颜色来确定来自不同角度的环境光。这可以实现比Gradient更精细的效果。Gradient:可为来自天空、地平线和地面的环境光选择单独的颜色,并在它们之间平滑混合。Color:对所有环境光使用单调颜色。

  • Environment Reflections:此部分包含反射探针烘焙的全局设置,以及影响全局反射的设置。

    • Source:使用此设置来指定是否使用Skybox进行反射效果,或是选择Cubemap。默认值是Skybox。Skybox:选择此选项可使用天空盒作为反射源。Custom:选择此选项可以使用Cubemap资源或类型为cube的RenderTexture进行反射。

    • Resolution:使用此属性可设置用于反射的天空盒的分辨率。仅当Source设置为Skybox时,此属性才可见。

    • Cubemap:使用此属性可设置用于反射的Cubemap。仅当Source设置为Custom时,此属性才可见。

    • Compression:使用此属性可定义是否压缩反射纹理。默认设置是Auto。Auto:如果压缩格式合适,则压缩反射纹理。Uncompressed:反射纹理以非压缩状态存储在内存中。Compressed:压缩纹理。

    • Intensity Multiplier:反射源在反射对象中可见的程度。可以理解为反射强度。

    • Bounces: 当来自一个对象的反射随后被另一个对象反射时,便发生反射反弹。使用此属性可设置反射探针评估对象之间来回反弹的次数。如果设置为 1,则 Unity 只会考虑初始反射(即上面Source属性中指定的天空盒和Cubemap)。

5.4.4.2 Other Settings

Other Settings 部分包含雾(Fog)、光环(Halo)、光晕(Flare)、剪影(Cookies)的设置。

  • Fog:在场景中启用或禁用雾效。请注意,此模式无法用于延迟渲染路径。勾选后会出现额外三个属性。

    • Color:设置Unity在场景中所绘制的雾的颜色。

    • Mode:定义雾化效果随着与摄像机距离变化而积累的方式。有Linear、Exponential、Exponential Squared。Linear:雾效强度随着距离线性增加,同时具有两个可设置属性,Start:设置在距离摄像机多远时开始雾效,End:设置在距离摄像机多远时雾效完全遮挡场景游戏对象。Exponential: 雾效强度随着距离呈指数增加,有一个可设置属性,Density:用于控制雾效的强度,雾效强度随着Density增加而增加。Exponential Squared:雾效强度随着距离更快速增加(指数和平方),有一个可设置属性,Density:用于控制雾效的强度。雾效强度随着Density增加而增加。

  • Halo Texture:光环纹理。设置要用于在光源周围绘制光环的纹理。

  • Halo Strength:光环强度。定义光源周围光环的可见性,值在 0 到 1 之间。

  • Flare Fade Speed:光晕过渡速度。定义最初出现镜头光晕之后从视图中淡出的时间(以秒为单位)。默认情况下,该值设置为3。(PS:名字是Speed,文档却说设置值表示时间,真自由啊。)

  • Flare Strength:光晕强度。定义光源下镜头光晕的可见性,值在 0 到 1 之间。

  • Spot Cookie:设置你想要用于聚光灯的Cookie纹理(即,聚光灯默认情况下的Cookie)。默认为soft。若要选择soft,请选择None(即为soft)。

5.4.5 Realtime Lightmaps

        显示实时GI系统生成的所有光照贴图。更具体的,显示了当前场景中由Enlightenment实时全局照明系统生成的所有光照贴图。如果项目中没有启用“Realtime Global Illumination”,则此窗口将为空。

5.4.6 Baked Lightmaps

        显示烘焙GI系统生成的所有光照贴图。更具体的,显示了由Lightmapper为当前场景生成的所有光照贴图,和光照数据资源(Lighting Data Asset)。如果我们使用场景视图绘制模式(Scene view Draw Modes)来预览光照映射,那么这个窗口将还包含Unity为预览生成的临时光照贴图。如果项目中未启用“Baked Global Illumination”,则该窗口为空。

5.4.7 Probe Volumes

        此窗口包含与Probe Volumes相关的设置。只有在项目中使用HDRP时才会出现此窗口。有关更多信息:Probe Volumes

5.4.8 Control Area

        用于预计算光照数据的控件,其位于 Lighting 窗口的底部。

  • GPU Baking Device:使用这个来改变Unity用于预计算光照数据的GPU。此属性仅在使用GPU Progressive Lightmapper后端时可见。

  • GPU Baking Profile:在此属性中选择的配置文件定义了GPU Ligh

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值