您想找什么?
Industry

死者之书Quixel、风、场景构建和内容优化技巧

JULIEN HEIJMANS / UNITY TECHNOLOGIESAnonymous
Jun 29, 2018|18 Min
死者之书Quixel、风、场景构建和内容优化技巧
为方便起见,此网页已进行机器翻译。我们无法保证翻译内容的准确性或可靠性。如果您对翻译内容的准确性有疑问,请参阅此网页的官方英文版本。

在本系列博客中,我们将介绍制作演示程序的方方面面 亡灵书.今天,我们将重点介绍与 Quixel 的合作、我们的风力系统、场景构建和内容优化技巧。这是我们 "制作 "系列博客的第四篇博客。如果您错过了这篇文章,可以回顾一下前三篇 PostProcessing的内容,它们介绍了《亡灵书》中的角色概念艺术 和摄影测量资产、树木和视觉特效的创作过程。

你好!我叫 Julien Heijmans,是 Unity 演示团队的一名环境艺术家。我去年才加入 Unity Industry,但我在视频游戏行业有大约 7 年的经验。这篇博文将从我的视角、内容创作者和环境艺术家的视角为您介绍《亡灵书》的制作过程。

我是摄影测量资产工作的新手,但我清楚地记得几年前 Quixel 宣布创建 Megascans 的那一天。从那时起,我就一直渴望有机会与他们的资产合作。加入 Unity 的 Demo 团队后,我开始着手制作《亡灵之书》,从而实现了这一目标。

如果你想开始尝试使用本博客中讨论的工具,可以下载《亡灵书》:环境项目。

下载项目

与 Quixel 合作
Quixel、Megascans、フォトグラメトリ、環境アート

当我加入这个项目时,我意识到我们不仅使用了 Quixel 的 Megascans 库中的资产,Unity 和 Quixel 还合作创建了这个项目。

在制作过程中,演示团队创建了一份他们需要的资产清单,如果现有资料库中缺少匹配的资产,Quixel 就会捕捉新的资产。这些资产中有许多是草地、植物和灌木丛等植被,需要适当的设备和设置才能扫描。

Quixel 不仅为我们提供了这些资产的纹理表,还创建了几何图形,其 LOD 和顶点颜色设置可支持我们的风着色器。

Title

在已发布的《死者之书》之间:在 "环境 "项目和预告片中使用的未发布资产中,我们收到了 50 多份高质量、高复杂度的资产。

在制作过程中,我们可以将资产快速导入引擎,而且看起来很不错。我们经常会调整纹理(主要是反照率,调整亮度/层次/曲线,并经常调整颜色以统一整个场景),将它们重新打包,将 LOD 调整到我们想要的水平,将纹理分配到一个新的 HDRP Lit 材质,然后就大功告成了。

幸运的是,Quixel 最近发布了一款名为 Megascans Bridge 的工具,它可以完成我们手动完成的大部分导入工作。它节省了为 HDRP 等重新打包纹理的时间。

Title

对于那些对更多 Megascans 资产感兴趣的人,这里提醒大家,Unity 资产商店上有多个Megascans Collections。所有资产都可以导入到使用高清渲染管道或轻量级渲染管道设置的项目中。

图片

为植被资产及其整个流水线建立风力系统始终是一个棘手的过程。有许多不同种类的植被资产需要以不同的方式制作动画;两棵不同的树可能需要完全不同的设置和不同的着色器复杂度。

因此,我们的团队决定为植被资产上的风效创建一个基于顶点着色器的自定义程序动画。我们根据具体的项目及其所包含的树木或灌木丛量身定制。让我们能够完全控制它。

我们的技术主管 Torbjorn Laedre 使用 3 种不同的技术制作了一种着色器,可支持多种不同类型的植被:

  • 层次枢轴,用于结构/层次非常明确的树木和一些植物
  • 单支点,用于草地、小型植物和结构/层次不明确的大型灌木丛
  • 程序动画,用于无法预测枢轴的植被资产。
图片

在内容方面,树是需要准备的比较复杂的资产,它们使用层次枢轴动画类型,依赖于 3 个不同的层次结构:

  • 行李箱,放在地上。
  • 与主干相连的 A 级分支。
  • 与 A 级分支相连的 B 级分支。

着色器需要知道树中每个顶点的层次和枢轴。首先,我必须创建树本身的几何图形,然后使用绿色顶点颜色通道为树上的每个多边形分配层次。

图片
  • 如果顶点颜色的绿色通道值为 0,则表示这是树干。
  • 介于 0 和 1 之间的值为 A 分支级别
  • 值为 1 的分支机构为 B 级

我使用 Autodesk Maya 完成了这项工作,通过一些小脚本,我能够在 10-15 分钟内设置好资产的所有 LOD。

除此之外,我们还使用了所谓的 "翩翩面具"。它们是纹理遮罩,有助于确定树枝支点在几何图形中的位置。我们将其用于使用硬 Alpha 纹理的几何体分支。下面是这种面具的图解。

Title

准备好所有这些信息后,我就可以使用 C# 脚本输入我的树预制件,并生成一个包含每个顶点枢轴信息的新预制件。在场景中添加 WindControl 对象后,我就可以在场景中导入我的树,并开始使用材质属性。

你可以看到,每个层次结构级别都有一个范围属性(基本上是主干或分支的长度)和一个弹性属性。

还有一些属性可以设置风飘动动画。他们在顶点位置添加了一些程序噪音,以模仿风吹树枝时树枝的振动。

最后,但并非最不重要的一点是,我们必须让风声 FX 影响风的动画效果。声音的大小决定了动画的风力强弱。一个简单的想法就能为项目锦上添花,实在令人惊讶。如果您还没有这样做,您应该打开项目四处走走。当你听到周围刮起大风时,你会发现周围的树和草都在摇晃。

布局

在确定《亡灵书》这类项目的细节和密度时,我必须考虑如何构建关卡,以避免后期制作时出现性能问题。我尽量注意的一点是,限制场景中的长视距。为此,您可以在场景布局中设置 "走廊 "和 "瓶颈"。

图片

这些布局,加上正确设置为 "Occluder static "和 "Occludee static "标志的资产,将使 Unity 的遮蔽剔除更加高效。

这段视频展示了遮挡剔除可视化效果,从俯视图中你可以很容易地猜出摄像头的视角。在视频末尾,我启用/禁用了遮挡剔除,并查看了哪些物体被遮挡剔除。

您还可以看到,有些对象没有被剔除,这些主要是非常高大的树木,有些超过 25 米高,它们的边界框非常大,因此很难在悬崖后面剔除。

使用 Unity 传统地形

当预告片发布时,我们看到有评论说我们不可能使用传统的地形系统。但这正是我们所使用的,而且我们修改了高清渲染管道的分层光照着色器以支持它。

HDRP 分层着色器允许使用高度贴图纹理对图层进行混合,因此效果比传统地形着色器的线性混合效果更好。

图片

当然,这只是一个临时解决方案,并没有正确集成到用户界面中。要更改地形,您需要编辑应用于地形的材质,而不是使用地形对象 "绘制纹理 "选项卡中的 "编辑纹理 "按钮。

图片
图片

如果您想创建一个新地形并在其上应用不同的纹理,则需要复制此 TerrainLayeredLit 材质并将其分配给新地形。您还需要在 "绘制纹理 "选项卡中创建这 4 组纹理。其中指定的纹理不会用于渲染地形,但可以让你在地形上绘制不同的图层。您还可以在这里更改不同图层的平铺属性。

此外,为了充分利用 LODGroup 功能,所有通过地形放置的资产都要设置为 "树",而不是细节资产。

Title

但实际上,这个项目有大量的资产散落在地面上:草地、灌木丛、图纸、木枝、石头等。有了所有这些,地形就可以相当简单了,你可以看到下面这张照片中的地形只是一个简单的平铺材料。

分散的细节资产

当你在关卡中行走时,会发现地面上散落着大量的小树枝和松果。

Title

当你在关卡中走动时,这些东西其实并不明显,但当你开始观察地面时,它们就会让场景的细节更加丰富。有时,在地面上、岩石和枯树干之间会有数百根小树枝,就像它们从树上掉下来最终会休息一样。因此,Torbjorn Laedre 制作了一个工具,帮助我们将这些小细节分散到关卡中。

树枝是简单的剪切平面,采用阿尔法材料。我们为它们添加了物理胶囊碰撞器。

Title

脚本首先会在一个变换位置周围生成所需的散射物体数量,然后模拟物理原理,让它们落到地面上,与地形和所有其他资产(岩石、枯树干等)发生碰撞。然后,按下 "Bake(烘烤)"按钮,它们就会被去除碰撞器,合并成一个对象,并分配给一个具有特定距离的 LODGroup,在该距离上它们应该被剔除。

该脚本用于场景中名为 "UberTreeSpawner "的对象,您可以随意使用。

关于这个工具的附带说明:为了让树枝和其他散落的物体正确地落在地面和其他资产上,您需要在场景中的所有资产上设置相当高密度的网格碰撞器。同时,你也不希望在游戏运行时使用这些重型碰撞器。因此,场景中的大部分资产都有两个不同的碰撞器:玩家控制器在播放模式下实时使用的一盏灯,并指定了默认图层。还有一个专门用于对这些树枝进行物理模拟,并指定了 "GroundScatter "图层。

打光

死者之书环境项目正在使用烘焙间接全局照明和实时直接照明。

来自太阳的间接照明和来自天空的直接加间接照明都被植入光照图和光照探测器中。反射探头、遮挡探头和其他遮挡源也会被烘焙。而太阳直射则是实时照明。使用实时直射光时,高清渲染管道中的着色效果最佳,而且还能让我们在运行时自由地对定向光的旋转、强度和色温进行动画处理。

Title

由于间接照明是经过烘焙的,因此我们不能过多地改变定向光的强度和颜色,否则它将不再与烘焙照明相匹配。尽管森林在遮蔽不匹配的间接照明方面是一个相当宽松的环境,但在这种设置下,我们无法实现完整的昼夜循环。

烘焙光照贴图主要用于地形和其他一些资产,但我们更倾向于在项目中的所有岩石和悬崖上结合使用光照探针和遮蔽探针,因为它们能为具有锐角和清晰法线贴图的物体提供更好的效果。

闭塞探头

为茂密的森林实时打光是一件非常棘手的事情。树木枝叶繁茂,表面积巨大,几何形状复杂,因此用光贴图覆盖它们并不现实。每棵树使用一个光探头,就能让树从底部到顶部获得均匀的照明。光探测器代理卷更接近我们的要求,但要提高网格分辨率来捕捉精细细节并不现实。

因此,我们的高级图形程序员 Robert Cupisz 开发了闭塞探针。

从艺术家的角度来看,这是一个非常不错且易于使用的功能:您只需将对象添加到场景中,它就会显示一个体积小工具,您需要对其进行缩放以覆盖所需的区域,然后在 X、Y 和 Z 方向上设置其分辨率参数。

图片

如果希望场景中的某些区域有更高密度的探针,还可以创建 "细节 "闭塞探针。设置完成后,您需要烘焙整个场景的灯光。闭塞探头将在此过程中进行烘烤。

3D 网格中的每个探测器通过向上半球发射射线来采样天空能见度,并将其存储为从完全遮挡 0 到完全可见 1 的 8 位值。这样,只要树叶和树枝比较密集的地方,就会出现较暗的区域--当几棵树聚集在一起时,情况就更糟糕了。

如果探测器不幸落在树干或岩石内,则会全黑。为避免黑暗信息泄露,它们会被标记为无效,并被相邻的有效探测器覆盖。

由于探测器对天空可见度进行了采样,因此应该只会衰减天空的直接贡献。因此,在设置光线映射器时,要排除常规光线探针的直射光贡献,然后探针照明由光线探针和被遮挡探针遮挡的直射天空探针组成。

这样,我们就可以使用大量廉价的遮挡探头,对树叶遮挡天空的小细节进行采样,从而为图像带来深度,同时也可以使用极少数昂贵的光线探头,对变化较慢的间接光线进行采样。

图像

如果您想更清楚地了解它们对场景的影响,也可以使用 SkyOcclusion 调试视图。

Title

Unity 2018.1 中添加了用于烘焙闭塞探针和排除光探针的直接天空贡献的闭塞探针 API,项目中提供了所有脚本和着色器。

大气散射

我们移植并重新使用了最初为铁匠演示开发的大气散射解决方案。

我们的高级程序员 Lasse Jon Fuglsang Pedersen 对其进行了扩展,以利用时间超采样技术,使其看起来更加平滑。

图像
高清渲染管道传输

高清渲染管道默认的光着色器支持多种类型的扩散。它允许你使用具有次表面散射的材料,或者像本项目中所有植被一样,使用仅透光的半透明材料。

图像

这种效果设置在两个不同的位置:

  • 在材质上,您需要选择 "半透明 "材质类型,输入厚度贴图,并选择扩散轮廓,这是第二个位置:
  • 扩散轮廓设置,您可以在此编辑传输效果的所有其他参数
Title

请注意:我们的团队增加了额外的滑块,分别控制直接传输和间接传输,以便对最终结果有更多的控制。但这一改动并不符合 PBR 规则,因此无法进入高清渲染管道。

面积

区域卷建立在 SRP 提供的核心卷系统之上,与 Post Processing 卷非常相似。它们的功能是根据主摄像机对象的位置来驱动对象属性。

包括 "方向光"、"大气散射"、"自动对焦 "和 "风控制 "在内的一些对象的属性由 "区域卷 "驱动,因此,如果您想更改当前的照明设置,则需要在相应的 "区域卷 "中进行更改。这些 "区域卷轴 "对象位于主场景的 _SceneSettings > _AREASETTINGS 下,后缀名为"_AV"。

调试窗口

对于不常使用高清渲染管道的用户,现在可以通过菜单 "窗口">"常规">"渲染管道调试 "打开一个特定的 SRP 调试窗口。

图像
图像

有了这个功能,您就可以查看单个 GBuffer 图层、照明组件或材质中的特定纹理贴图,甚至可以覆盖反照率/光滑度/法线。当你遇到某些对象无法正确渲染或其他视觉错误时,它是一个非常有用的工具。这将帮助您更快地找到问题的根源。

最棒的是,这些调试视图是由着色器自动生成的,编码人员可以非常轻松地创建新的调试视图。

图像

我甚至用这些调试视图创建了场景背景中使用的树形广告牌。我只是把我的资产放在一个空场景中,然后在反照率、粗糙度、法线 gbuffer 图层可见的情况下截图,并用这些图层创建纹理贴图。

优化

虽然代码方面的优化占了很大一部分,但要想获得合适的帧速率,正确设置资产和场景也很重要。以下是为该项目优化内容的一些方法:

  • 我们的所有材料都使用 GPU 实例。
  • 我们在这个场景中的大部分资产都使用了 LOD,这是必备的。
  • LOD Crossfade 功能非常强大,它可以在物体的不同细节级别之间进行流畅的混合。但这一功能相当繁重,确实会增加项目中的绘制调用次数。因此,我们在尽可能多的资产上禁用了这一功能。
  • 为了避免 LOD 之间的明显过渡,我们开始在许多大型岩石和悬崖资产上使用对象空间法线贴图。
title
图像

请注意:使用对象空间法线贴图而不是切线空间法线贴图会降低法线贴图的精度。实际上,这在我们的粗糙和嘈杂的资产上并不明显,但你可能并不想把它用在硬表面资产上。

  • 虽然通过构建场景的方式和使用遮挡剔除来限制视距非常重要,但值得注意的是,用于渲染场景的许多绘制调用实际上都来自于阴影贴图的每个级联渲染(更具体地说,来自于我们项目中的定向光)。
  • 我们从散布在地形上的小型植被资产中收到了大量的牵引呼叫,有些地方甚至有成百上千个。通过扩大草地和植物资产的面积,我们很好地减少了调用次数。这样一来,我们就不会再有数以百计的这些人,而只会有 15-20 人。
    需要注意的是,这会对视觉质量产生影响,因为有了这么大的资产,就很难避免草地与岩石和其他放置在地面上的资产发生剪切。
  • 我们正在使用图层剔除功能,这是 Unity 中已有的功能,但没有任何用户界面。此功能可让您根据对象与摄像机的距离,选择指定到特定图层的对象。Torbjorn 对这一功能进行了扩展,使其还能在不同距离上对这些物体的阴影投射进行删减。例如,我们的大多数小型植被资产在 15 米左右的距离就不再投射阴影,考虑到草地和地面上其他植物的噪点量,这一点并不十分明显,但在 25 米左右的距离就会被完全删除--无论其 LODGroup 如何设置。

---

敬请期待本系列的下一篇博文。我们将探讨《亡灵书》中的阴影、灯光、后期处理等创作工作。

如果您未能参加柏林 Unite 展览会,我们将很快发布朱利安-海曼斯(Julien Heijmans)关于演示环境艺术的演讲。您可以关注我们的YouTube频道,了解该视频的最新发布时间。

有关《亡灵书》的更多信息