赞
踩
本文地址:https://blog.csdn.net/t163361/article/details/123883151
最近准备申请新星创作者,需要2000个粉丝关注,觉得文章有用的,请点一下左侧边栏的关注,谢谢。
翻译说明:
教程翻译主要用谷歌翻译,然后对特别不通顺的地方进行了微调。同时针对一些比较重要的地方保留了英语或英语和汉语同时存在的方式方便大家理解。
中级 20分钟
在本教程中,您将使用预计算的实时全局照明(GI)设置您的场景照明,并启动预计算过程。
在这第一个教程中,你将使用预计算的实时全局照明(GI)来设置你的场景照明。
如果你还没有这样做,下载项目资源,并在Unity编辑器中打开它们。
使用预计算实时 GI 为照明设置场景时,需要做出的首要决定之一是确定场景的默认间接分辨率(Indirect Resolution)。间接分辨率是指每个世界单位中使用的实时光照贴图texels(纹理像素)的数量。
你可以在“Lighting”窗口中观察或设置间接分辨率,步骤如下:
在设置场景时,了解项目所需的单位比例(unit scale)很重要。 在您的项目中,单位可能是米、英尺或厘米。 Unity 单位在现实世界比例中没有默认等效值,因此由用户决定单位(unit)代表什么。
在我们的示例项目中,我们决定单位等于1米。某些物理概念也有相同的假设。例如,重力以单位每秒表示,这是Unity的默认值。因此,假设一个单位相当于1米,对于真实世界类的游戏场景来说是一个很好的设置。
选择适当的间接分辨率
通常,您的场景的间接分辨率可以根据您的游戏世界的规模来确定。 例如,您的场景是否是一个小而丰富的室内环境,反射光照变化很大? 在这种情况下,更高的光照贴图分辨率(例如每单位 2-3 个纹素(texels))可能是合理的,以便捕获这种更详细或“高频”的光照。
也许你的场景是一个大型户外环境,其世界规模要大得多。你可能有数百甚至数千个单位的表面,而这些区域几乎没有变化来修改反射光的颜色。在这种情况下,适合捕捉室内场景中错综复杂的照明细节的分辨率,在应用于户外环境的大范围和不太有特色的区域时,将是一种浪费。我们将浪费宝贵的CPU时间和可用的内存,因为我们必须存储和更新对场景整体外观没有太大贡献的光照贴图纹素(texels)。更重要的是,出于本教程的目的,我们将增加光照预计算过程中必须考虑的光照贴图纹素(texels)的数量。这可能会对预计算时间产生巨大影响。
在室外环境的情况下,适当的光照贴图分辨率对于场景中的大型对象可能介于每单位 0.5 -1纹素(texels)之间,或者对于地形而言可能介于 0.1 - 0.5纹素(texels)之间。
Unity的预计算实时GI所需要的间接分辨率值要比“传统的”光照贴图纹理像素密度小几个数量级。这是因为你在这些光照贴图中只捕捉了间接光线,而这往往是非常柔和或“低频”的。当你使用预计算的实时GI时,清晰的阴影通常是由实时阴影提供的,而不是高分辨率的光照贴图。
使用在传统光映射技术中看似合适的值(例如,每个单元30个纹素(texels))可能会导致预计算失败或无法完成。假设您正在使用单位大小为 1 个单位 = 1 米的人体比例场景,更合适的值是:
注:如果世界范围有很大不同,则需要对这些值进行相应调整。
当最初设置场景的间接分辨率时,你为场景中的静态对象指定了默认分辨率。带有在 Inspector 顶部标记为 Contribute GI 的 MeshRenderer 的新游戏对象将使用此值,除非另有修改。
逐对象光照贴图分辨率
除了为整个场景选择间接分辨率外,您还可以选择基于每个对象更改光照贴图分辨率。 如果您需要更高分辨率提供的额外保真度,您可以有选择地增加此值。
通常,将最常见的分辨率设置为场景默认值,然后在需要更多照明细节的对象上手动提高分辨率的工作量较少。我们将在本教程的后面讨论修改每个对象分辨率的方法。
如果您想继续学习,您将在 Unity 项目中包含的 LightingTutorialStart 场景中工作,以获得此学习体验。
在示例场景中,有一个具有中等大小地形且颜色相当一致的户外环境。 为此,每单位 0.5 纹素的低间接分辨率就足以捕捉场景中其他对象的反射光照。 但是,也有一些木屋。 这些要详细得多。
因为在场景中房屋的数量比地形物体的数量要多,所以你应该将间接分辨率设置为适合房屋的大小。然后,您可以单独修改地形对象使用的分辨率。这将减少在准备场景时所需的工作量。
考虑到这一点,为默认的间接分辨率设置每个世界单位1个纹素:
假设我们已经决定场景的比例为1单位= 1m,这意味着由Unity的Precomputed Realtime GI创建的单个光照贴图纹素的大小将等效为1x1米。这可能看起来很低,但请记住,你只是捕捉间接光。来自直接照明的清晰阴影和镜面反射将由场景中的实时灯光提供。
在 Unity 的预计算实时 GI 中,图表(Chart)是光照贴图纹理的一个区域,您可以将给定场景对象的光照贴图 UV 映射到该区域。 您可以将其视为包含影响该对象的照明图像的小图块(tile)。 图表(Chart)由两部分组成:辐照度(照明)和方向性(编码主要光的方向)。
生成预计算实时GI时,会为图表(Chart)中包含的每个纹素计算光照。场景中大量的图表(Charts)可能是对预计算时间的最大损害之一,因此了解图表(Charts)的工作原理以及如何管理它们以优化照明预计算时间非常重要。
图表(Charts)是如何工作的?
默认情况下,每个图表至少有 4x4 纹素。 因此,一个图表至少有16个纹素,而不管世界中对象的比例或相应 UV 壳(shell)的大小。 例如,如果一个对象是 1x1 米,该对象有 1 个图表(Chart)且间接分辨率为 1,则该对象需要 16 个纹素。
这个最小尺寸使 Unity 能够将图表(Charts)拼接在一起,以实现跨几何边缘的无缝照明。 Unity 需要沿图表(Charts)边缘至少有 4 个纹素,以便在找到并缝合相应的伙伴之前唯一标识它。
实时 GI 不需要填充(No padding is needed for realtime GI),因为在网格导入管道的打包阶段,Unity 会钳制光照贴图 UV 以在图表内提供半纹素边框。 这意味着图表可以彼此相邻,并且仍然可以进行双线性插值而不会交叉出血(cross bleeding),从而节省宝贵的光照贴图空间。
图表和优化
想象一下同一个示例 1x1 米对象有 50 个图表。 Unity 将为该对象创建 800 个纹素,尽管它相对较小。 这演示了拥有大量图表会如何快速增加纹素的数量。 更多的纹素意味着更多的光照计算和更多的数据来计算、压缩和存储。在复杂的场景中,所有这些加起来会导致冗长的预计算和运行时的性能下降。
不适当的图表是导致预计算未完成或耗时过长的主要原因。考虑到这一点,许多减少预计算时间的明显策略就是减少场景中图表的数量。
要使用预计算实时GI生成照明解决方案,必须启动预计算进程。首先,你必须在我们的场景中至少有一个对象被标记为Contribute GI。
在Hierarchy视图中组织和分组游戏对象使它能够快速和容易地选择游戏对象以包含在照明预计算中。组织游戏对象层次结构的策略有很多。详细讨论这些不同的策略超出了本教程的范围。然而,重要的是要理解,当你在场景中进行重复选择时,拥有一些组织游戏对象的方案将大大提高你的生产力。
在示例场景中,GameObject被组织成到一个名为Environment的父对象下的分类中。这个组包含了所有的可见的,静态的MeshRenderers,它们组成了我们场景的环境。在此之下,有一些对象的子组,它们在大小或拓扑方面具有相似的特征。
最有效的方法是从粗略地应用照明设置开始,然后随着您的前进逐步细化细节。 选择所有环境子游戏对象:
现在场景有了一些静态游戏对象,你可以开始预计算过程:
注意:我们建议您在学习这些教程时保持Auto Generate模式。
在本教程中,您设置了场景,并启动了照明的预计算过程。接下来,你将在场景中创建和布置光探针。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。