自动地形是根据我们创建的地形样貌自动为合适的地方匹配合适的材质。实际过程中地形往往很复杂,如果我们直接去刷材质可能需要很多时间。此时我们就可以选择创建一个自动地形材质。
根据地形斜率自动分配材质


这是一个斜率遮罩。VertexNormalWS是顶点法线,代表物体每个顶点的法向量,我们取它的B通道,也就是z轴。当平面水平时,它的法向量z轴为1,而当平面垂直时,它的z轴为0。所以这就是我们判断地形斜率的来源。为了能够调整其效果,我们添加一个加与乘。因为最后它需要连到alpha通道上,所以需要将数值钳制在0到1之间。最后添加1-x节点进行反向(反向只是利于理解)。
PixelNormalWS是像素法线,它表示每个像素的法向量,所以它比顶点法线更加精确。如果你想实现更精确的效果可以将顶点法线替换为像素法线,或者将顶点法线与像素法线进行lerp混合。

将两种材质连到MakeMaterialAttributes,再用BlenderMaterialAttributes混合材质,这个BlenderMaterialAttributes相当于对两种材质进行lerp。我们用刚才做好的斜率遮罩连接到Alpha通道。

如果直接使用默认值你会发现只有非常垂直的面才会出现岩石材质,坡度稍微平缓的时候是两种材质的混合,并不美观。所以我们需要调整这两种参数来实现更好的效果。
根据默认值的斜率遮罩,当地形水平时,值为1,地形垂直时,值为0。我们需要把其中有一些坡度的值更接近0,因为我们想把坡度材质设为岩石。所以,在add节点的参数设置为一个接近-1的负数(但不可小于-1,不然全都会是岩石材质),这样当坡度比较平缓时它的值就等于或者接近0了。但只进行减法会将原本水平的值变为一个小数,最终呈现草与岩石的混合材质,所以我们给它乘一个较大的数值,让水平面的值能够为1。
根据距离远近修改材质uv缩放
有时候当物体里我们足够远时,有时候观看这些物体可能会非常奇怪。这是因为其纹理密度过高造成的,所以我们需要让远处物体的uv密度降低,近处的uv密度保持不变。


距离遮罩制作:我们需要用到节点PixelDepth。PixelDepth是像素深度,表示物体每个像素点与摄像机的距离。因为像素深度是一个很大的值,而alpha通道的值需要在0到1之间,所以我们需要减去一个比较大的数,再除以一个比较大的数来调整最终效果,最后添加saturate节点将最终数值钳制在0到1之间。
将原来的地形复制一份,并在uv后面乘一个数来改变其uv密度,最后用BlenderMaterialAttributes将新材质与原来的材质混合就可以了。

根据地形高度自动分配材质


要实现这种效果需要用到节点worldpostion绝对世界位置,这个节点表示每个像素在世界场景中的坐标。我们需要高度,所以用z轴(在较老版本的虚幻引擎里绝对世界位置只有一个引脚,你需要用mask节点把B通道提取出来)。为了能调整整体高度,我们给它加上一个数值,这个数值是你希望它从一个高度开始区分两种材质,这样就能做到在此高度以上的值都是大于1的数,在此高度以下的值都是小于1的数(中间过度的距离实在太小了可以忽略)。最后我们用saturate节点将最终的值钳制在0到1之间。这样就能实现第一张图的效果,但是从某一条线开始材质突然变化很奇怪,我们可以使用一些贴图来将进行一些上下移动。所以我将那一张法线贴图的一个通道与我们刚才做的东西相加。因为法线贴图的数值很小,所以需要乘一个比较大的数来使效果明显出来。
