unity shaderGraph实例-可交互草地

效果展示

请添加图片描述

整体结构

请添加图片描述

各区域内容

区域1

在这里插入图片描述
计算交互用的cube和草各个顶点的距离
此处可以理解为,从cube的中心到草的顶点的距离,其距离是一个从0到整数的过程,如下图
在这里插入图片描述

区域2

在这里插入图片描述
将距离除以某个值,这个值是交互范围,相当于将白条范围向右移动
在这里插入图片描述
然后使用saturate节点将值限制到0-1之内

区域3

在这里插入图片描述
首先上一步已经将值限制到0-1,这一步取反,直观解释就是将黑白条对调,越靠近cube的部分越白,也就代表了对草的顶点shader的影响越强。
在这里插入图片描述

区域4

在这里插入图片描述
为了移动草的顶点向量,我们需要知道移动方法,用草的顶点位置减去cube的世界坐标即可获得两者的方向

然后和区域3中计算出的影响力度相乘,即可得到越靠近,顶点偏移越大的效果。

区域5

在这里插入图片描述
这一步看似复杂,其实做的事很简单,将区域4中获得顶点偏移量加到草原本的顶点坐标上去,由于草不需要再y轴移动,所以只加x轴和z轴即可。

区域6

在这里插入图片描述

在草移动时,我们不需要草的根部移动,所以我们使用了顶点颜色,即在制作草的模型的时候,在根部的顶点处添加了顶点颜色(注意不是贴图的颜色)为黑色,可交互部分为白色,这样可以通过一个Lerp,在不需要移动的区域和需要移动的区域里平滑过渡,当然这里也可以用顶点坐标计算。

区域7

最后我们需要给一张贴图
在这里插入图片描述

GraphSetttings

在这里插入图片描述

最后需要编写一个脚本,告诉材质cube在哪

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TrackPosition : MonoBehaviour
{
    
    
    public Material grassMat;
    private void Update()
    {
    
    
        grassMat.SetVector("_TrackerPosition_v3", transform.position);
    }
}

然后挂到cube上,将材质球拖到属性里即可

工程下载gitee地址

猜你喜欢

转载自blog.csdn.net/weixin_44568736/article/details/134409530