Houdini+UE4制作好看的地形(材质篇)

本篇讲如何配合使用Houdini和UE4,来将现成的素材用在自己的地形上。

Houdini部分我们会直接从预处理好的Heightfield开始,关于如何处理可以参考我的另一篇文章的“地形处理”部分https://blog.csdn.net/qq_42219469/article/details/108262472

UE4部分(1):素材的获取与规划

首先,我们可以去epic商城下载到好看的素材包直接导入到现有工程;或者下载完整demo,将demo工程内的Content文件夹移动到现有工程内。

例如下面两张图(前者是素材包,后者是官方的demo工程)

添加完素材后,我们打开UE4工程,打开素材中的demo地图:

先在Outliner中选择地形,然后拖动Details面板到Landscape Material,点击放大镜,下方Browser中就会出现该材质的位置,记下该位置。

然后按shift+3打开地形页面:

选择面板中的“Paint”,然后查看下方有哪些Layer(这些Layer即为Material中绑定的Layer)。

由于我们需要利用Houdini进行程序化生成,而不是手动刷Layer。所以我们需要在Layer列表中观察,找出我们需要的所有材质,并记住对应的Layers名称。

这次我们做一个带小斜坡的平原地形,所以这里我们选择使用Layer_3和Layer_5,分别用来刷到斜坡和草地上。

Houdini部分:地形Layer生成以及材质绑定

接下来,我们在Houdini中使用强大的Heightfield Mask by Feature节点,依次进行如下流程:

 

创建一个Heightfield Mask by Feature节点,选择Mask by Slope,然后调整下方的两个参数(最小和最大角度),使红色区域覆盖到我们的所有斜坡(红色区域为Layer覆盖的地方)

此时,该Layer存在我们的mask层中。(注:mask层相当于我们的临时工作区,每制作完一个Layer,需要将其另存为一个新Layer,才能在mask层中进行下一个Layer的制作)

 

我们创建一个Heightfield Copy Layer节点,将目前的mask拷贝到一个新Layer上,并在Destination属性写上该Layer的名字,注意该名字需要和UE4中记录的一致。由于这次我们创建的mask是斜坡,由前面步骤可知,这里要写上Layer_3。

 

由于我们这次只需要生成两个Layer,即地图上不是斜坡就一定是草地,所以我们可以用取巧的方法,在刚才的mask基础上创建一个Heightfield Remap节点,并进行如下的设置,将当前的mask进行0到1,1到0的倒转映射。

 

完成之后可以看到mask中红色区域和白色区域交换了,这时我们就可以再次复制mask到新的Layer中,这次Layer为草地,所以命名为Layer_5。

 

制作完所有Layer后,我们在节点中点击信息页面,可以看到:除了Layer_3,Layer_5,height,mask之外,还有许多不认识的Layer,这些都是之前我们的地形处理节点(如Erode)悄悄添加的,后续用不上它们。

所以我们创建一个Blast节点将没用的Layer全部删除,我们只保留高度层和自己创建的Layer。设置如下,Group中列出需要保留的Layer,然后选择Delete Non Selected即可。

最后,我们添加一个unreal material节点,用来导入unreal中的材质,这样HDA所cook出的地形会自动绑定上材质,注意下图中参数面板中的String。

把这个String拖到subnet-Type Properties中的Parameters面板中暴露给ue4方便更改(这里改了一下其Label)。

设置完成后保存hda,回到UE4。

UE4部分(2):材质的修改与调整

在UE4中将hda拖进场景生成实例,然后打开details中的参数面板。新加的String参数需要我们在ue4中对要用的材质(即我们先前在demo地图中记下的材质)点击右键,选择Copy Reference,然后直接粘贴进去即可。

 

在ue4中recook,效果如下

可以看到Layers起作用了,不过有点丑,跟素材demo差距过大,因为地上并没有草。

有些材质会自带草,但对于不自带的,我们也可以按以下步骤自己加。首先双击打开我们使用的材质球,如果是instance就点击Hierarchy,选择打开它的原始材质球。

PS:原始材质节点中同样可以找到材质绑定的全部layer列表,可以再次对比确认

 

接下来我们在空白的地方创建两个节点:LandscapeLayerSample和LandscapeGrassOutput并链接它们

首先把sample节点的参数改成你想添加草地的layer名字(这里是Layer_5)

我们点开LandscapeGrassOutput节点参数面板中的两个小三角,发现需要放进一个Grass类。

 

如果素材中没有的话我们接下来手动创建一个,首先在Content Browser中右键,选择Foliage-Landscape Grass Type。

双击打开它,然后点击Grass Varieties右边的加号,如果想要植被多种多样,就多点几次,对每个新增元素单独修改即可。

点开新增元素的小三角,同时在Content Browser中找到素材中的植物模型,选择自己想用的赋值给Grass Mesh,同时还可以修改下方的Grass Density改变其分布密度大小(例如草坪Density较大,花朵Density较小),顺便注意一下下方的Start/End Cull Distance,等会可能会回来调整。

注意下方还有个Cast Dynamic Shadow建议关掉,会极大影响性能

这边我加了一种草和四种花,草的密度为默认400,花的密度为10-20。做好后将整个类赋值给之前的LandscapeGrassOutput节点,然后recook地形。

可以看到草地Layer的地形自动加上了草和花,而其他Layer没有。注意到远处的草地没有植被,这是因为UE4为了性能会剔除掉远处的物体。如果不想它们被剔除,可以回到刚才的草地类型编辑页面,将刚才提到的Start/End Cull Distance参数修改大一些。(为了性能可以只对草坪进行修改)修改完效果如下

加上之前撒上的树。

总结

重点是在Houdini中为HeightField添加各个Layer,且Layer名称与材质球绑定的Layer对应,然后使用unreal_material节点即可。

其他风格的素材都可以参照这个步骤来使用,从而做出自己想要的地形,创建复杂的多层Layer需要灵活使用Houdini Heightfield Mask by Feature(或by Object等等)节点,使用时请参考官方文档。

按此文章流程生成的最终地形重复率较高,有点不自然。可以尝试在Houdini中制作多层Layer加权混合,尽量还原出素材demo的样式。制作时还可参考下图在demo地图中打开Layer Debug模式,选择不同Layer的RGB显示,来查看demo中的Layer分布。

猜你喜欢

转载自blog.csdn.net/qq_42219469/article/details/108002214
今日推荐