在揭秘《死者之书》的系列文章中,我们已经分享了:
揭秘《死者之书》之概念艺术揭秘《死者之书》之角色资源创作揭秘《死者之书》之环境资源及特效创作

本篇文章将由Unity Demo团队环境艺术家Julien Heijmans从内容创作者和环境艺术家的角度,为我们提供一些关于《死者之书》制作过程的深入解读。本篇文章我们将关注点放在风系统、场景地形和内容优化技巧。

Unity与Quixel的合作
我们不仅仅让《死者之书》只供人欣赏,我们还提供了这个项目中的环境资源,前往Asset Store资源商店搜索“Book Of The Dead: Environment“,即可免费下载。

在此资源文件中,我们在使用了摄影制图法进行创作。而其中一些资源来自Quixel公司Megascans库的扫描环境艺术资源,Unity与Quixel在这个项目的制作上达成了紧密的合作。

122104clxz4mrsbs33su9s.png

在制作过程中,Unity Demo团队创建了一个所需资源的列表,如果现有的扫描库中缺少合适的对应资源,Quixel则会为之采集新资源。这其中的不少资源都是植被,例如:草地、植物和灌木丛,这些资源需要合适的设备和布置来进行扫描。

Quixel不仅为我们提供了资源的纹理集,还创建了相应的几何,带有LOD和顶点色设置,用来支持我们的风着色器。

122105i4vp24ppasbf6pav.png

在这个过程中,我们收到了超过50个高质量资源,这些资源较为复杂,我们不得不依靠着团队中为数不多的艺术家努力有限的时间中完成项目。

在制作期间,我们快速的将资源载入到Unity中,得到不错的外观效果。我们经常会调整纹理,修改反照率、亮度、等级和曲线,修改色彩从而使它们与场景效果更为统一。我们重新调整LOD到所希望的等级,并且将纹理指定给一个新的HDRP光照材质。

幸运的是,Quixel发布了一个工具Megascans Bridge,它能完成之前大量我们需要手工完成的导入工作。Megascans Bridge在为HDRP重打包纹理时节省了大量时间。

122105hrqphaqizijrioyi.png

如果你对Megascans中资源感兴趣,想要获取更多这类资源, 可以访问Asset Store资源商店获取。所有这些资源都能够导入到项目配置中,不管项目使用的是高分辨率渲染管线还是轻量级渲染管线。


为植被资源及其整个管线建立风系统始终是一个非常棘手的过程。 在场景中,许多不同种类的植被资源需要以不同的方式进行动画处理,例如:二种不同的树或许需要完全不同的设置和不同的着色器复杂度来完成。

因此,我们决定创建一个基于自定义顶点着色器的程序动画,应用于对植被资源产生风效果。它适合我们的特定项目中的树木或灌木丛,并且允许我们完全控制它。

122115a2fpzw0gph4j7323.png
顶点颜色的绿色通道数值为0时,表示这个部分是树干。 数值在0和1之间则是A级树枝。 数值为1则是B级树枝。

这部分任务使用了Maya完成,通过使用一些小脚本,可以在10-15分钟内设置好一个资源的所有LOD。

除此之外,我们还使用了“Flutter Mask”(抖动遮罩)。抖动遮罩是纹理遮罩,能够帮助确定在几何上树枝的轴心位置。下图是这个遮罩的图示。

122121i6s031c0dgmgx0ck.png

这些布局结合正确设置“Occluder static”和“Occludee static”标记的资源后,会使Unity的遮罩剔除更为高效。

https://v.qq.com/x/page/f0723myh6h5.html

上面的视频展示了遮罩剔除的可视化过程,我们可以看出摄像机是从顶部视图进行观察的。在视频结尾,启用/禁用了遮罩剔除,然后查看对象如何被遮罩剔除功能剔除。

我们也能看到一些没被剔除的对象,这些对象大多是非常高大的树木,有些超过25米高,这些树有很大的边框,因此很难在峭壁后剔除。

Unity传统地形的使用
在《死者之书》预告片发布后,我们看到有些评论说:决不可能在这个项目中使用传统地形系统。但实际上我们使用的就是传统地形系统,我们修改了HD渲染管线的Layered Lit着色器来支持它。HDRP Layered Lit着色器允许使用高度图纹理来混合图层,所以得到的结果会比传统地形着色器的线性混合功能更好。

122129s5ahaq55qshjaqhc.png

这些图层主要是为了帮助绘制地形上的不同图层。它们不是用来渲染地形的,除非是使用平铺设置。

122622aws3x2zzhidlwsyu.png

与此相反,寻找适用于地形的材料,我们会发现所有纹理和材质属性都会影响地形。

如果要创建新地形并在其上应用不同纹理,则需要拷贝TerrainLayeredLit材质,并将其指定到新地形上。还需要在Paint Texture标签中创建4个纹理集。指定的纹理不会用来渲染地形,但它们会让我们在地形上绘制不同的图层,还可以修改不同图层的平铺设置。

此外,为了能够完全使用LODGroup功能,所有在地形上放置的资源都会设置为树木(Trees)而不是具体的资源。

122630zcnjwwnwninjj5sw.png

如果只是在关卡附近移动时,这并不明显,但我们开始注视地面时,这些小树枝和松果给场景带来了细节。

有时候地面会有数百根细小的树枝,分散在岩石和枯萎树干之间,这感觉就像它们自然从树上脱落在这些位置。手工放置它们是不可能的,所以Torbjorn Laedre制作了一个工具帮助我们将这些小型细节对象分散这些关卡中。

小树枝是带有Alpha材质的简单切口平面。我们给这些小树枝添加了物理胶囊碰撞体。

122630cl07c2vqdve42uq0.png

该脚本首先会在变换位置周围生成指定数量的零散对象,然后为它们模拟落到地面的物理效果,它们落下后会与地形、资源岩石、枯萎树干等相互碰撞。然后按下按钮“Bake”,小树枝的碰撞体会被移除,合并为单个对象,然后指定给一个带有特定剔除距离的LODGroup。

https://v.qq.com/x/page/y0723issf15.html

此脚本在场景中被应用于名为“UberTreeSpawner”的对象,你可以根据需要随意使用它。

关于此工具的附注:为了使零散对象适当落在地面和资源上,在场景中的所有资源上需要有较高密度的网格碰撞体。同时在游戏运行时,这些大型碰撞体不能被使用。 出于这个原因,场景中的多数资源带有二个不同的碰撞体:一个是轻量的,会被PlayerController用在运行模式的实时环境中,指定为默认图层。另一个则用于小树枝的物理效果模拟上,指定为GroundScatter图层。

光照
《死者之书》项目使用了带有实时方向光的已烘焙间接全局光照。

来自太阳的间接光照和来自天空的直接加间接光照都被烘焙到光照贴图和光照探针中。反射探针、遮蔽探针和遮蔽源也会被烘焙。另一方面,直接太阳光阳光直射贡献也是实时光照。在使用实时直接光照时,在HD渲染管线中的着色效果最好,它也能让我们给运行时方向光的旋转、强度和色温设置动画。

122638gxf7cc8cezb6gw6c.png

如果希望场景中某些区域拥有更高密度的探针,它还能允许创建“细节”遮蔽探针。设置完成后,需要烘焙整个场景的光照。遮蔽探针会在这个过程中被烘焙。

通过在上半球发射光线,3D网格中的每个探针会对天空可见度进行采样,并将其存储为从完全遮蔽的0到完全可见的1的8位值。这使得我们在有更高浓度的树叶和树枝的地方使用更暗的区域。即使那里只有几棵树聚集在一起也会如此。

落到树干或石块中的探针完全是黑的。为了避免黑色泄露出来,它们会被标记为无效,并被周围的有效探针重写。

由于探针会对天空的可见部分进行采样,它们只能减弱直接天空贡献。所以,光照贴图会设置为从常规光照探针中排除直接光照贡献,然后探针光照由光照探针和直接天空探针组成,这些直接天空探针都被遮蔽探针遮挡。

这样一来我们就获得了大量低功耗廉价遮蔽探针,它们会对叶子遮挡天空的细节进行采样,为图像带来深度,我们也得到了少量性能消耗较大的光照探针,用来采集缓慢变化的间接光照。

122645gakac6cka25xc64l.png

这个遮蔽探针API已经加入到Unity 2018.1中,它可以用于烘焙遮蔽探针并从光照探针中排除直接天空贡献,项目中的提供了所有脚本和着色器。

大气散射
我们移植并重用了为《Blacksmith》演示项目所开发的大气散射(Atmospheric Scattering)解决方案。

我们的高级程序师Lasse Jon Fuglsang Pedersen对其进行了拓展,使之可以利用临时超采样功能,从而使外观更为平滑。

123115bbl5i4b5lae011v8.png

注意:我们添加了额外的滑块来分别控制直接和间接透光,从而能够让最终结果有更好的可控性。但这个改动并不遵循PBR原则,所以不会将它加入HD渲染管线。

Area Volumes
Area Volumes被构建在由SRP提供的核心系统上,与Post Process Volumes非常相似。它们的功能根据主摄像机对象的位置修改对象属性。

包括方向光照、大气散射、自动聚焦和WindControl在内的多个对象都有受Area Volumes控制自带属性,因此,如果想要修改当前的光照设置,则需要在对应Area Volumes中进行操作。那些Area Volume对象在主场景中,位于_SceneSettings > _AREASETTINGS目录下,带有后缀“_AV”。

调试窗口
针对使用HD渲染管线不多的用户,现在有一个特定的SRP调试窗口,你可以通过菜单Window > General > Render Pipeline Debug打开它。
[attachimg]14639
[/attachimg] 123115zi8sih88m2imkskp.png

通过这种方式,你可以看到独立的GBuffer图层、光照组件或是材质中的特定纹理贴图,或甚至是重写反照率/平滑度/法线。当一些对象没正确渲染或是有视觉bug时,这是个非常有用的工具。它会帮助你更快标出问题的源头。

这些调试视图是从着色器自动生成的,编码器能够非常轻松地创建新的调试视图。

123116tnr63nnrj5ninii0.png
有一些调试视图能够从渲染管线调试窗口打开

我们使用这些调试视图来创建在场景背景中使用的树状广告牌。过程很简单,仅需把自定义资源放到空白场景中,然后捕获带有可见反照率、粗糙度和法线Gbuffer图层等属性的截图,然后将它们用来创建自定义的纹理贴图。

优化
虽然优化的大部分内容属于代码部分,但如果你想要拥有合适的帧率,合理设置好资源和场景也很重要。

下面是一些为项目优化内容的方法:
所有的材质都使用了GPU实例化(GPU Instancing)。 我们对场景中的多数资源使用了LOD。 LOD交叉淡入淡出(The LOD Crossfade)功能很棒,它能够给不同细节等级的对象带来好看又平滑的混合效果。但这个功能消耗性能,而且会提升项目中的绘图调用。所以尽可能在大量资源上禁用这个功能。 为了避免LOD之间的可见过渡区域,我们在大型石块和峭壁资源上使用对象空间(Object Space)法线贴图。


123115c6gj6u8zrnm8mgnu.png锐亚教育

锐亚教育 锐亚科技 unity unity教程