Unity地形材质贴图随高度变化


参考自: https://zhuanlan.zhihu.com/p/72410143.

由于项目情况,一些特效插件不能在LWRP渲染管道下运行,因此导入了Amplify Shader Editor 可视化Shader插件完成

1. 导入Amplify Shader Editor插件

Unity地形材质贴图随高度变化

2. 进行可视化Shader编写

打开Window—>Amplify Shader Editor—>OpenCanvas
Unity地形材质贴图随高度变化
图表左上角的白点为创建或保存Shader
Unity地形材质贴图随高度变化
创建WorldPosition节点,Remap节点,以及两个float节点和一个vector2节点,进行连接
Unity地形材质贴图随高度变化
WorldPosition节点用于获取模型在世界空间坐标的位置,因为我们只需要获取Y轴的坐标,因此要将WorldPosition中的Y输出引脚连接至Remap节点,Remap则是将坐标重映射,例如上图则是将MinOld和MaxOld值重新映射成MinNew和MaxNew,输出的则是MinNew和MaxNew之间的值

创建Saturate节点,Lerp节点和两个TextureSample节点,进行连接
Unity地形材质贴图随高度变化
Saturate节点用于限制Remap最后输出的值,如果大于1则返回1,小于0则返回0,将Saturate输出引脚连接至Lerp的Time节点,让材质可以随地形高度来插值变化贴图

3. 给地形赋值材质球进行测试

创建地形后在地形设置里可以更换材质球,但是更换后就不能使用地形笔刷去刷贴图
Unity地形材质贴图随高度变化
在地形上用笔刷刷出一个小山坡测试效果
Unity地形材质贴图随高度变化
贴图可以在材质球里自行更换
Unity地形材质贴图随高度变化

4. 继续编写Shader

将第一组的shader节点复制粘贴出四个
Unity地形材质贴图随高度变化
其中要注意的是Ramap中的MinOld输入引脚连接的是一个高度层中最低的高度值,MaxOld输入引脚则是最高的高度值
Unity地形材质贴图随高度变化
同理Lerp的A,B输入引脚也是如此,A连接两个高度层中下面的那层的贴图,B则是上面那层的贴图
Unity地形材质贴图随高度变化
了解了第一层和第二层的变化逻辑后后面几层的也就容易连了,复制粘贴三组后将第一组的Lerp输出值连接至第二层的Lerp的A引脚,第一层的MaxOld值则是连接至第二层Remap的MinOld引脚
Unity地形材质贴图随高度变化
剩余两层也是这么连接,最终的shader如下
Unity地形材质贴图随高度变化

5. 最终效果

Unity地形材质贴图随高度变化
Unity地形材质贴图随高度变化

PS. 设置材质编辑属性

点击单个变量或贴图节点,在左边一栏Type设置为Property,勾选Auto-Register选项,然后保存shader即可在材质球里设置属性值
Unity地形材质贴图随高度变化
在图表左边最后一个则是shader暴露给材质的属性,可以自行调整顺序
Unity地形材质贴图随高度变化