*基于 Unity 6 引擎制作的 demo 《Time Ghost》
开始《Time Ghost》项目时的目标之一是提升在 Unity 中构建大型户外环境的构建标准。为了实现这一目标,我们要有处理更为复杂的场景的能力、有足够的工具支持,同时它对引擎的核心图形、光照、后处理、渲染和性能也提出了更高的要求。虽然我们能够预见到 Unity 6 的图形改进能满足大部分需求,但工具方面仍面临挑战。
随着游戏世界变得越来越复杂,高效的工具对于管理自然资产的放置和渲染变得至关重要。我们需要一个智能系统来确保环境资产的真实分布与多样性。同时,由于计划使用大量的植被,因此渲染方面的技术解决方案,既要具备扩展性,也要在运行时保持较高的性能。
本文将分享构建《Time Ghost》场景环境中的一些做法,并解析我们所用的工作流程和工具。
生成散布数据
第一步,我们将构成环境基础的网格导入 DCC 软件(本例中是 Houdini)。这些网格可以是激光雷达(LiDAR)扫描、无人机扫描或在 Unity 中手动雕刻的地形。对于 Houdini,我们开发了散布分析工具。这些工具可以根据地形属性自动放置资产,帮助我们设计和生成细节丰富、多种多样的连贯的逼真环境。
此外,通过采用 SpeedTree 和标准摄影测量工作流程,我们还创建了高质量的植被预制件并将其散布在网格上。散布系统允许对随机性和密度进行微调,确保植被的自然分布和多样性。
接下来,我们将散布数据从 Houdini 导出为点缓存/点云,使用的是 Unity 在 GitHub 上提供的 VFX Toolbox 中的 Point Cache Exporter HDA 稍加改动的版本。这个工具可以保存每个散布实例的位置,同时保存其缩放、方向、颜色、年龄和健康属性,并为散布数据中的每种模型生成一个点缓存。
Unity 集成
利用 DOTS(面向数据技术栈)和 ECS(实体组件系统),我们可以创建包含成千上万个实体的场景,同时保持性能稳定。这是通过实体实例化和资源分配的精细管理实现的。
每个从 Houdini 导出的点云资产实际上只是由位置、方向、缩放等信息组成的集合,可能还包括一些额外的数据(例如年龄、健康状况、颜色等)。我们将所有 Houdini 导出的点云汇集到一个名为 PointCloudFromHoudiniAsset 的资源中。这个资源读取原始点云,根据命名规则找到要与每个点云搭配的预制件,并创建数据的内部表示形式。这些数据被存储在 PointCloudFromHoudiniAsset 中,随后在烘焙过程中被划分为多个空间分区,以便更快速地进行数据流式加载。
下一步是在 ECS 子场景中添加一个创作组件(authoring component),名为 ScatterPointCloudAuthoring。该组件将 PointCloudFromHoudiniAsset 和一些参数作为输入数据,这些参数可用于控制何时加载和卸载数据,以及如何对点云数据进行细分。
为了高效地流式传输数据,我们将点云数据细分为场景区块(scene sections),这些区块可以单独加载和卸载。这样,我们就可以根据距离视角的远近来加载和卸载不同的区块。区块的大小由创作组件中的 ScatterSceneSectionSize 属性控制。
然而,这些场景区块相对较大,如果一次性实例化所有数据,将导致 CPU 负载骤增。每个场景区块可能包含数十万个点,因此,这些区块会进一步细分为更小的图块(tile),称为“散布图块”(由创作组件中的 ScatterTileSize 属性控制)。实例化逻辑会根据重要性规则,选择接下来需要实例化的散布图块以及需要卸载的图块。
图块替身
即便可以高效地流式加载和卸载实例,我们依然面临需要渲染大量实例的问题。许多实例的体积较小,如草丛,在远处移动时仅覆盖屏幕的小块区域。因此,我们将部分散布实例烘焙为图块替身(tile impostor)。图块替身覆盖特定区域,并模仿该区域散布实例的外观。
数据直接从点云资产中获取,因为我们希望控制图块包含的植被类型。在本例中,我们仅关注草地资产,忽略同一区域内的树木。
图块替身(tile impostor)生成器从上方渲染属于该图块的所有实例,生成包含每个图块的近似颜色、法线和深度信息的低分辨率纹理。此外,一些最重要的植物类型被选中并从侧面和上方渲染到图集上。这个图集被所有图块共享,并用于为每个图块的低分辨率纹理数据生成细节。生成器还创建了一个由多个四角面组成的网格,代表图块并让四角面朝向视角。
在运行时,我们将每个图块的低分辨率纹理信息与更详细但通用的植被纹理集条目,投射到图块替身网格上,从而生成图块的近似外观。
随着摄像机逐渐远离某个区域,单个实例首先会切换到较低的细节级别(LOD),最终被图块替身所取代。图块替身也有多个细节级别,随着摄像机进一步远离,四角面的分布会变得更为稀疏。
提升大型场景性能的替身系统
对于场景中非常远的对象,我们使用八面体替身(octahedral imposters)。这种方法可以显示距离摄像机较远物体的简化版本,从而在视觉效果与性能之间取得平衡。我们开发了一个简单的工具,可以直接在 Unity 中生成并集成这些替身。这个工具简化了工作流程,提供了优化性能的同时保持高视觉标准的高效方法。
植被控制系统
我们的植被控制系统提供了复杂的配置设置,可以调整风速、风的变化和频率等环境效果,确保环境中动画元素的真实感和性能。
植被着色器接收健康和年龄属性,用以实现自然的颜色变化和更真实的风相应效果。比如,一株干燥的植物会更僵硬,摆动幅度小于绿色的植物。
场景中的实体也经过设计,可与角色进行逼真的交互。例如,植被会对角色的存在和移动做出动态响应。这个系统采用基于 GPU 的方法来处理与植被的交互(如碰撞),并通过简化的弹簧物理(spring physics)来计算和模拟角色与环境元素交互的效果。
高质量的环境光照
自适应探针体积(APV)
为了获得高质量的光照效果,场景通常需要在不同区域使用不同的光照设置。对于光线会在各种不规则表面上反弹的狭小空间,和光照相对均匀的开阔平原上,往往需要采用不同的处理方法。
Unity 6 引入了新的“自适应探针体积”功能,它会自动在最需要光照探针的地方放置探针。
(注:通过可视化工具展示光照探针的位置时,可以明显看出壕沟里的探针比平原上的更密集,可以捕捉到更为细致的光照变化。)
场景混合
场景混合(Scenario Blending)让我们可以烘焙不同的光照设置状态,并在这些状态之间进行平滑过渡。
这样就可以为同一环境的不同时间创建不同的光照场景。太阳角度和环境色的变化可以通过实时光照来实现,而烘焙的光照场景让间接光照也能够相匹配。
接下来的计划
在当今先进的数字环境创建中,实现大量自然资源的自然连续分布和光照处理(无论是细致的近景还是宽广的远景,)都是至关重要的。基于ECS的处理方法不仅提升了画面质量,还在数据处理和解读方面提供了极大的灵活性,同时考虑了大型实时3D项目的性能需求。
我们已经在 Unity Asset Store 中发布了《Time Ghost》demo 的两个 Unity 项目——一个是环境场景,另一个是角色。如果你想亲自体验上述流程的效果,可以下载《Time Ghost: Environment》项目,其中包含我们用 Unity 6 为《Time Ghost》创建的一个环境场景。
https://assetstore.unity.com/packages/essentials/tutorial-projects/time-ghost-environment-298911
示例旨在展示我们使用的技术和方法,帮助你评估是否可以将类似的思路应用到自己的项目中。