版本:Unity 6 (6000.0)
语言:English
光照贴图 UV
生成光照贴图 UV

光照贴图 UV 简介

实时全局光照一组模拟直接和间接光照的技术,以提供逼真的光照效果。
请参阅术语表
系统和烘焙全局光照系统都使用光照贴图,因此需要光照贴图预渲染的纹理,包含光源对场景中静态物体的影响。光照贴图叠加在场景几何体上以创建光照效果。 更多信息
请参阅术语表
UV。

Unity 为实时全局光照系统和烘焙全局光照系统使用单独的光照贴图 UV 集。这样做的原因有两个。

  • 实时光照贴图和烘焙光照贴图之间实例分组没有直接对应关系;同一实时光照贴图中的实例可能位于两个不同的烘焙光照贴图中,反之亦然。
  • 在不同比例尺下出现的网格在烘焙光照贴图中共享光照贴图 UV,但在实时光照贴图中不共享 UV。

烘焙光照贴图 UV

烘焙光照贴图 UV 是每个网格的:同一网格Unity 的主要图形基元。网格构成 3D 世界的很大一部分。Unity 支持三角形或四边形多边形网格。NURBS、NURMS、细分曲面必须转换为多边形。 更多信息
请参阅术语表
的所有实例共享相同的烘焙光照贴图 UV。导入模型时,Unity 可以计算烘焙光照贴图的 UV,或者您可以提供自己的数据。

Unity 将烘焙光照贴图 UV 存储在其网格的Mesh.uv2通道中。此通道映射到 TEXCOORD1 着色器在 GPU 上运行的程序。 更多信息
请参阅术语表
语义,通常称为“UV1”。

如果启用了烘焙全局光照,并且给定的 MeshRenderer 从光照贴图接收全局光照,则 Unity 使用Mesh.uv2通道中的数据将烘焙光照贴图正确映射到网格。

注意:如果要在给定网格中将Mesh.uv2用于其他目的,则必须确保使用该网格的所有 MeshRenderer 组件都从灯光探针灯光探针存储有关光线如何穿过场景空间的信息。在给定空间内排列的一组灯光探针可以改善该空间内移动物体和静态 LOD 场景的光照效果。 更多信息
请参阅术语表
而不是光照贴图接收全局光照。使用网格渲染器组件检查器MeshRenderer.receiveGI API 更改此设置。

有关更多信息,请参阅生成光照贴图 UV

实时光照贴图 UV

实时光照贴图 UV 是每个网格渲染器的:同一网格的所有实例共享相同的输入数据,但网格渲染器网格组件,它获取网格过滤器的几何体并在对象 Transform 组件定义的位置渲染它。 更多信息
请参阅术语表
的不同实例可以在运行时使用不同的实时光照贴图 UV。Unity 在预计算阶段计算实时全局光照系统的 UV。此计算将每个网格的 UV 作为输入,并使用该数据创建每个网格渲染器的 UV。导入模型时,Unity 可以生成每个网格的输入 UV,或者您可以提供自己的数据。

工作原理如下

  • Unity 可以使用Mesh.uv3通道中的数据作为实时光照贴图 UV 计算的输入。Mesh.uv3映射到 TEXCOORD2 着色器语义,通常称为“UV2”。
  • 如果Mesh.uv3中没有数据,但Mesh.uv2中有数据,则 Unity 会回退到使用Mesh.uv2中的数据作为实时光照贴图 UV 计算的输入。Mesh.uv2用于烘焙光照贴图 UV。通常使用烘焙光照贴图 UV 作为实时光照贴图 UV 的输入数据。
  • 计算结果存储在每个网格渲染器的MeshRenderer.enlightenVertexStream中。如果启用了实时全局光照,并且给定的 MeshRenderer 组件有助于全局光照并从光照贴图接收全局光照,则 Unity 会自动将MeshRenderer.enlightenVertexStream中的数据传递到着色器中的 TEXCOORD2,而不是 Mesh.uv3 中的数据。

注意:如果要在使用实时全局光照的网格中将Mesh.uv3用于其他目的,则必须确保使用该网格的所有 MeshRenderer 组件都从灯光探针而不是光照贴图接收全局光照。使用网格渲染器组件检查器MeshRenderer.receiveGI API 更改此设置。

有关更多信息,请参阅生成光照贴图 UV

Unity 如何计算实时光照贴图 UV

当 Unity 获取每个网格的输入 UV 并将其处理成每个网格渲染器的输出 UV 时,会发生以下情况。

打包

Unity 重新打包实时光照贴图 UV,以确保每个图表的边界在所有方向上都落在纹素中心,然后在每个图表的边界周围添加半个纹素的填充。这确保了所有图表之间都有一个完整的纹素空间。

这是因为实时光照贴图的分辨率故意设置得很低,以使其能够实时更新。低分辨率不会影响图形质量,因为这些光照贴图仅存储低频间接光照,但当图表共享纹素时可能会导致出血。重新打包可确保图表永远不会共享纹素。它避免了这个问题,并且还允许 Unity 高效地将图表彼此相邻打包。

注意:这种打包技术意味着计算出的 UV 取决于实例的比例和光照贴图分辨率,这就是实时光照贴图 UV 是每个网格渲染器的原因;但是,Unity 会尽可能自动优化此功能,并且使用相同网格以及相同比例和光照贴图分辨率的网格渲染器共享相同的 UV。

合并

或者,您可以在此过程中指示 Unity 尽可能合并 UV 图表。这减少了光照贴图的大小,并且可以提高运行时内存使用率和性能。

您可以在任何具有网格渲染器组件的游戏对象Unity 场景中的基本对象,可以表示角色、道具、场景、摄像机、路径点等。游戏对象的功用由附加到它的组件定义。 更多信息
请参阅术语表
上启用此优化。在网格渲染器检查器中,导航到光照贴图部分并选择优化实时 UV

注意:此功能有时会在原始 UV 映射中的不连续性方面出错。例如,一个有意设计的锋利边缘可能会被误解为连续的表面。如果发生这种情况,请禁用此功能。

光照贴图 UV
生成光照贴图 UV