UE教程

用心搭建好场景

在UE4中如何制作程序草丛 ?

Hello,大家好,今天给大家带来的是通过Megascans, SpeedTree & UE4制作程序草丛。

3D环境艺术家Karsten Malmquist向我们展示了如何创建实时的程序草,阐述了如何使用Megascans扫描的库,结合SpeedTree创建草丛,并讲解了如何设置草的着色器。

如何制作程序草丛 ?

一、介绍

我是Karsten Malmquist,是瑞典Malmö的Ernst&Borg工作室的环境艺术家。我毕业于Malmö的游戏开发学校The game Assembly,我曾在PortaPlay和Star Vault中《Mortal Online2》担任实习生。

二、程序草丛项目

我已经在这个项目上忙活了好几个周末。最初只是为了一种景观效果的尝试,后来变成了更大的东西了。在这一点上,这更像是一个大项目的第一个“里程碑”,我想程序生成一个完整的生物群落。对我来说,这几乎就像在空气中绘画一样,但是这个是3D的!

如何制作程序草丛 ?

从Megascans 到SpeedTree工作流程

通常我的工作流程先是从浏览Megascans库开始,因为,我想要知道哪些资产是可以使用的。在浏览时,我会划分出哪些资产是可以开箱即用,哪些资产是可以通过再修改,然后变成我项目中的资产。在这种情况下,Megascans库中有很多可以使用的草模型,但是,我看到它们的模型面数比我想想中的还要密集,所以,我决定制作自己的草丛。

我清楚要自己制作草丛后,我开始收集Megascans中不同的草丛图集,匹配SpeedTree制作合适的草丛。我之所以使用SpeedTree,是因为它提供了一种非破坏性的程序化工作流程,你可以在其中改变几乎任何想法,而无需从头重做。我使用Megascans的扫描图集是因为,你可以尝试许多不同的漂亮图集作为素材,而不必花费大量时间制作高质量高模型。

在尝试不同的草丛贴图纹理时,我得出的结论是,单个草丛之间的间距越大,最终效果看起来会越好。当我草丛之间的间隔很紧密的时候,整个纹理随着mipmap开始混合在一起,这样就破坏了,草是由一根根细丝组成的错觉。

为了在SpeedTree中创建草丛,我通常是从创建模型片开始,并将模型顶点放置在贴图剪影顶部,并确保不同级别的LOD能够分配到合适的三角形。我现在不太担心最终的三角形数量,因为,我知道一旦我将草丛导入到Unreal Engine,结合整体效果,再次优化模型。

如何制作程序草丛 ?

设置完模型LOD后,我可以开始制作草丛。为此,我首先使用 Zone节点来定义草生成的位置,然后连接一个包含我之前创建的模型片的Leaf Mesh节点。SpeedTree通常的工作逻辑是子节点跟随着父节点生成,所以,这种情况下,叶子的模型片是在Zone节点创建的区域内生成的。

如何制作程序草丛 ?

为了从整体上调整草丛,我修改了Zone节点,是为了确定模型片生成的位置,然后修改了Leaf Mesh节点以改变模型片的生成数量和方向。

选择Zone节点后,我又转到“Generation”选项卡,并调整“sweep”设置,以使草丛以圆形生成,以及调整“Number”设置,在更多区域能够随机生成。

如何制作程序草丛 ?

选择Leaf Mesh节点,我还调整了 “Generation” 选项卡下的草的数量,然后,向下转到 “Local Orientation” 选项卡,更改了单个卡片的局部朝向。我个人建议尝试不同的设置,看看它们的哪个效果会更合适。

如何制作程序草丛 ?

在编辑草丛的时候,我还会考虑以下几点:

1.整个草丛的大小范围

2.这个草丛有多少模型面数

草丛的大小范围之间是相互影响的,是需要在引擎中生成一些实例地形来验证的。为了提高性能,你也许希望草丛范围大一些,以降低整体的资源开销,但是,你肯定也不希望它们太大,以至于草丛在一些不平坦的地形,出现这种类似的情况(悬浮)。

如何制作程序草丛 ?

模型片的数量会非常影响性能。因为,大量的模型面数会导致大量Alpha通道的透支,这是非常昂贵的开销。对于这个项目,我发现为了更好的效果,你可以额外的加一些模型面数,把完全透明的部分沿着透明通道裁切掉空白的部分。如果你在SpeedTree中制作自己的植被,我同时建议您尝试不同的模型面数,以找到最好效果方案。

下面是我的草丛现在在SpeedTree里面的样子:

如何制作程序草丛 ?

当我们在SpeedTree中制作好草丛后,它们就需要导入到虚幻引擎中了。在这一点上,我希望在整个场景中都可以看到草,而不是只有一个区域有。当引擎中有草之后,我也会继续在SpeedTree中做些调整,以便让它们在引擎中看起来更好看。然而,在我回到SpeedTree之前,我想在Unreal Engine中设置一个适当的Shader,这样我在改进草丛时,就不会被草地上那些奇怪的阴影分散注意力。

三、设置草地的Shader

通常将植被从SpeedTree导入Unreal Engine不会马上看起来很好看,因为,你需要一个好的Shader来让自己的植被看起来更好看。当然,在SpeedTree中也有一个选项,可以将现有的Material导出到Unreal中,但我发现,我需要一个比这个功能更全面的解决方案。所以,我没有使用导入默认的Shader,而是自己制作了这些功能:

1. 淡化效果,是基于草丛与相机的距离。

为了做到这一点,我使用了Per Instance Fade Amount这个节点,这个Shader节点可以设定视口与草之间实际渐弱量。为了使用这个节点,我必须用到一张草地贴图,贴在地面上,我用Landscape Material来做。打开Landscape Grass Type并将“Start Cull Distance”设置为低于“End Cull Distance”的值,将使Per Instance Fade Amount开始输出,在草的Material中,实际每个草的数量,在它们距离Start Cull Distance更远的时候就会渐弱。有了这些信息,我现在就可以调整草的整体不透明度,让它在远处是淡出的。

如何制作程序草丛 ?

2. 增加法线贴图的强度。

这将改善草光照在模型片上的效果,可以给人一种,每个草的光影是指向不同的方向的错觉,而不是看起来像一整排扁平的草。我使用了一个Flatten Normal节点来实现这个效果。这个结果是根据你使用的法线贴图而变化。理想情况下,你希望是草光影的指向是不同方向的,每个草都有不同的弯曲、扭曲和旋转,就像它们在自然界中做的那样。

如何制作程序草丛 ?

3. 次表面散射。

这个可以使草看起来更加真实的最重要的部分之一。我发现,使用albedo作为次表面颜色,对草来说效果很好,我还用顶点颜色弱弱的加暗草丛根部的区域,以便使草丛能够更好地与地表纹理得到混合。

如何制作程序草丛 ?

4. 颜色变化也很重要。

以摆脱草的颜色过于均匀,过于人为化。我在我的Shader中使用了小规模和大规模两种变化,小规模变化由一个名为Speed Tree Color Variation的节点组成,它为每个草提供随机颜色。大规模的颜色变化,是要在世界空间 XY中平铺一个纹理蒙版,我用它来实现两种颜色之间的变化。

如何制作程序草丛 ?

5. 高度变化

是我最喜欢的Shader功能之一,因为它可以让草看起来非常蓬松。我通过沿着法线的顶点偏移,来实现这个效果。由于我不想偏移草根,所以,我将顶点颜色刷在靠近地面的顶点上,好实现根部没有偏移效果。为了获得变化,我在世界空间中平铺一个蒙版,来指定那些草丛要偏移。

如何制作程序草丛 ?

这里是所有Shader的视觉汇总:

如何制作程序草丛 ?

四、设置Landscape Material

Landscape Material是这个项目中,将所有东西链接在一起的关键部分,它使我能够从根本上,以高层次的方式,来生成程序植被。Material本身也非常简单,它只有两层,一层叫“Grass”,另一层叫“Grass High”,我可以在Landscape这个环节将它画出来。用这些Landscape通道输出节点,再链接到不同的草节点。Grass层将产生一个较短的草,而Grass High层将产生一个更高的草。此外,我在整个Landscape的世界空间 XY 中使用蒙版平铺在 Grass 图层上生成杂草和花朵簇。最后,为了减少过度绘制,我通过简单地从各自的蒙版中减去高草蒙版来确保杂草、花朵和矮草不会在高草图层上生成。

如何制作程序草丛 ?

五、优化

我发现在优化任何类型的植被(包括草)时,优化的透支开销是最重要的一个问题。因为我想要一个漂亮的特写渲染,所以,我决定增加模型片,使草丛更密集。例如,如果我的目标想要达到 60 FPS,我就不会这样做。对我来说在这个项目上,我的 PC使用GTX 1060,以 40-45 FPS的速度运行1080p。所以,为了提高性能,我会减少草丛中模型片的密度(幸运的是,这是一个非常简单的解决方法,因为我在SpeedTree中使用了程序工作流),并在虚幻引擎中也能优化相对距更远的草。

如何制作程序草丛 ?

六、结论

回想起来,这个项目是一次非常有趣的经历,我从中学到了很多东西。我认为最大的挑战是弄清楚如何在SpeedTree中制作看起来不错的草丛,并结合在虚幻引擎中去完善这个结果。在我看来,弄清楚要使用什么样的贴图纹理,以及设置一个好的着色器,是两个关键的里程碑。

优化也是一个很大的挑战,虽然我尝试了不同的方法,并得出了一些结论,很明显如何制作优化精良的植被,还是有很多东西需要学习的,我希望在继续这个项目的过程中大家也能学到一些东西。

感谢你的阅读,我希望你觉得这很有趣。如果你有任何问题,请随时将它们发送给我!

– End –