Unity之ShaderGraph如何实现靠近显示溶解效果

前言

今天我们来实现一个我再B站看到的一个使用LeapMotion实现的用手部触摸就可以显示的溶解效果。
效果如下图所示:

主要节点

Position:提供对网格顶点或片段的Position 的访问,具体取决于节点所属图形部分的有效着色器阶段。使用Space下拉参数选择输出值的坐标空间。
Unity之ShaderGraph如何实现靠近显示溶解效果_第1张图片

Remap:基于输入 In 值在输入In Min Max的 x 和 y 分量之间的线性插值,返回输入Out Min Max的 x 和 y 分量之间的值
Unity之ShaderGraph如何实现靠近显示溶解效果_第2张图片

SimpleNoise:根据输入UV生成简单噪声或Value噪声。生成的噪声的大小由输入Scale控制。
Unity之ShaderGraph如何实现靠近显示溶解效果_第3张图片

OneMinuts:返回输入In减去 1的结果。
Unity之ShaderGraph如何实现靠近显示溶解效果_第4张图片

原理

首先我们知道Alpha Clip Trreshold可以控制物体的溶解,我们暴露一个属性Vector3,以他作为目标位置,然后我们计算这个目标位置距离沃恩要溶解的模型的顶点坐标的距离,当距离小于一定半径,我们就设置物体显示,否则就消除物体。然后我们可以使用SimpleNoise噪波图对结果进行一个相乘,这样就可以实现一个溶解的效果了。

最终连线

Unity之ShaderGraph如何实现靠近显示溶解效果_第5张图片

实时控制TargetPos的位置

我们创建一个球体或者一个任意手部模型,然后通过Update实时更新Shader的TargetPos的位置,就可以实现开始B站的LeapMotion视频的效果

using UnityEngine;

[ExecuteInEditMode]
public class ShaderPositionBinder : MonoBehaviour
{
    public Transform m_Target;

    private Renderer m_Renderer;
    private Vector4 m_Value;
    private static readonly int Position = Shader.PropertyToID("_Position");
    // private static readonly int Radius = Shader.PropertyToID("_Radius");

    void Start()
    {
        m_Renderer = gameObject.GetComponent<Renderer>();
    }

    void Update()
    {
        var position = m_Target.position;
        m_Value.Set(position.x, position.y, position.z, 1);
        m_Renderer.material.SetVector(Position, m_Value);
        // m_Renderer.material.SetFloat(Radius, m_Target.localScale.x);
    }
}

然后我们把需要操作的球体或者手部模型拖拽到Target的位置,可以可以看到如下效果。

效果

你可能感兴趣的:(unity,shader,ShaderGraph,ASE,靠近溶解,设置溶解位置,着色器)