Unity地形材质贴图随高度变化
地形材质贴图随高度变化
参考自: https://zhuanlan.zhihu.com/p/72410143.
由于项目情况,一些特效插件不能在LWRP渲染管道下运行,因此导入了Amplify Shader Editor 可视化Shader插件完成
1. 导入Amplify Shader Editor插件
2. 进行可视化Shader编写
打开Window—>Amplify Shader Editor—>OpenCanvas
图表左上角的白点为创建或保存Shader
创建WorldPosition节点,Remap节点,以及两个float节点和一个vector2节点,进行连接
WorldPosition节点用于获取模型在世界空间坐标的位置,因为我们只需要获取Y轴的坐标,因此要将WorldPosition中的Y输出引脚连接至Remap节点,Remap则是将坐标重映射,例如上图则是将MinOld和MaxOld值重新映射成MinNew和MaxNew,输出的则是MinNew和MaxNew之间的值
创建Saturate节点,Lerp节点和两个TextureSample节点,进行连接
Saturate节点用于限制Remap最后输出的值,如果大于1则返回1,小于0则返回0,将Saturate输出引脚连接至Lerp的Time节点,让材质可以随地形高度来插值变化贴图
3. 给地形赋值材质球进行测试
创建地形后在地形设置里可以更换材质球,但是更换后就不能使用地形笔刷去刷贴图
在地形上用笔刷刷出一个小山坡测试效果
贴图可以在材质球里自行更换
4. 继续编写Shader
将第一组的shader节点复制粘贴出四个
其中要注意的是Ramap中的MinOld输入引脚连接的是一个高度层中最低的高度值,MaxOld输入引脚则是最高的高度值
同理Lerp的A,B输入引脚也是如此,A连接两个高度层中下面的那层的贴图,B则是上面那层的贴图
了解了第一层和第二层的变化逻辑后后面几层的也就容易连了,复制粘贴三组后将第一组的Lerp输出值连接至第二层的Lerp的A引脚,第一层的MaxOld值则是连接至第二层Remap的MinOld引脚
剩余两层也是这么连接,最终的shader如下
5. 最终效果
PS. 设置材质编辑属性
点击单个变量或贴图节点,在左边一栏Type设置为Property,勾选Auto-Register选项,然后保存shader即可在材质球里设置属性值
在图表左边最后一个则是shader暴露给材质的属性,可以自行调整顺序