Unity 光照

阴影

配置阴影

可以使用 Inspector 为每个 Light 组件配置实时阴影和烘焙阴影设置。

场景中的每个网格渲染器 (Mesh Renderer) 还具有 Cast Shadows 和 Receive Shadows 属性,必须根据需要启用它们。

通过从下拉菜单中选择 On 启用 Cast Shadows,即可启用或禁用网格的阴影投射。或者,选择 Two Sided 以允许表面的任一面投射阴影(因此在进行阴影投射时会忽略背面剔除),或选择 Shadows Only 以允许不可见的游戏对象投射阴影。

参考:https://docs.unity3d.com/cn/2019.4/Manual/shadow-configuration.html

阴影性能

实时阴影具有相当高的渲染开销;任何可能投射阴影的游戏对象都必须首先渲染到阴影贴图中,然后该贴图将用于渲染可能接受阴影的对象。

柔和阴影比生硬阴影具有更大的渲染开销,但这仅影响 GPU,不会导致额外的 CPU 工作。

参考:https://docs.unity3d.com/cn/2019.4/Manual/ShadowPerformance.html

阴影不显示

如果您发现一个或多个对象未投射阴影,则应检查以下几点:

  • 可在 Quality 窗口中彻底禁用实时阴影。确保启用了正确的质量级别并为该设置启用了阴影。
  • 场景中的所有网格渲染器都必须正确设置相应的 Receive Shadows 和 Cast Shadows。默认情况下两者都已启用,但请检查确保未意外禁用它们。
  • 只有不透明对象才投射和接受阴影,因此使用内置透明着色器或粒子着色器的对象既不会投射也不会接受阴影。通常,您可以使用透明镂空着色器代替具有“间隙”的对象,例如栅栏、植被等。自定义着色器必须采用像素光照并使用几何渲染队列。
  • 使用 顶点光照 (VertexLit) 着色器的对象不能接受阴影,但可投射阴影。
  • 如果游戏对象的材质具有“无光照”类型的着色器,Unity 无法为这些游戏对象计算阴影。只有材质的着色器支持光照时,Unity 才能为材质计算阴影。
  • 在内置渲染管线中,使用前向渲染路径时,有些着色器只允许最亮的方向光投射阴影(这种情况尤其发生在 Unity 4.x 版本的旧版内置着色器中)。如果想使用多个阴影投射光,则应改用延迟着色 (Deferred Shading) 渲染路径。您可以使用 fullforwardshadows 表面着色器指令启用您自己的着色器以支持“全阴影”。

参考:https://docs.unity3d.com/cn/2019.4/Manual/ShadowPerformance.html

光照贴图

准备场景并烘焙光照贴图

从 Unity Editor 菜单中选择 Window > Rendering > Lighting Settings 以打开 Lighting 窗口。确保要应用光照贴图的网格具有适当的 UV 以进行光照贴图。最简单的方法是打开网格导入设置并启用 Generate Lightmap UVs 设置。

接下来,要控制光照贴图的分辨率,请前往 Lightmapping Settings 部分并调整 Lightmap Resolution 值。

为了将渲染器包含在光照贴图中,渲染器必须满足以下条件:

  • 具有 Mesh Renderer 或 Terrain 组件
  • 标记为 Contribute GI
  • 使用内置的 Unity 材质、标准着色器 (Standard Shader) 或具有 Meta Pass 的着色器

在 Mesh Renderer 组件中,可以使用 Scale In Lightmap 参数来调整光照贴图的静态网格或地形的分辨率。

此外,还可在 Light Explorer 中调整光源设置。

要为场景生成光照贴图,请执行以下操作:

  1. 在 Lighting 窗口中的 Scene 选项卡底部,单击 Generate Lighting(或者确保勾选了 Auto Generate)。
  2. Unity Editor 状态栏中将显示一个进度条(在右下角)。

当光照贴图完成时,Unity 的 Scene 和 Game 视图会自动更新,然后便可在 Lighting 窗口中查看生成的光照贴图。

手动生成光照时,Unity 将向 Assets 文件夹中添加光照数据资源、烘焙光照贴图和反射探针。

参考:https://docs.unity3d.com/cn/2019.4/Manual/Lightmapping.html

UV 重叠解决方案

1
There are 1 objects in the Scene with overlapping UV's. Please see the details list below or use the 'UV Overlap' visualisation mode in the Scene View or Lightmaps in Lighting Settings for more information.

UV 重叠没有唯一的解决方案,因为有很多问题可能导致这种情况。以下是最常见的解决方案:

  • 如果由 Unity 自动创建光照贴图 UV,则可以增加 Pack Margin。为此,请导航到网格 (Mesh) 导入设置的 Model 选项卡。确保已启用 Generate Lightmap UVs,然后展开 Advanced 并使用 Pack Margin 滑动条来增大值。这样会在图表之间产生更大间距,从而降低重叠的可能性。但是,这也会增加光照贴图的总空间要求,因此请尝试应用足够的间距来避免瑕疵,但不要过量。有关 Unity 自动创建的光照贴图 UV 的更多信息,请参阅有关生成光照贴图 UV 的文档。
  • 如果由您自己提供光照贴图 UV,可尝试使用建模包添加边距。
  • 提高整个光照贴图的分辨率。这样将增加图表之间的像素数量,从而降低发生渗漏的可能性。缺点是光照贴图可能会变得太大。您可以在 Lightmapper Settings 下的 Lighting 选项卡中执行此操作。
  • 提高单个游戏对象的分辨率。这种情况下可以仅为具有重叠 UV 的游戏对象提高光照贴图分辨率。这也可能增加光照贴图的大小,但可能性较小。您可以在 Lightmap Settings 下的 Mesh Renderer 中更改游戏对象的光照贴图分辨率。

参考:https://docs.unity3d.com/cn/2019.4/Manual/ProgressiveLightmapper-UVOverlap.html