Shader 学习之路-实现溶解效果的Shader(十一)

         我们都知道在游戏中,对于物体被溶解的效果,如降落伞溶解、纸张溶解销毁等,还是挺常见的,今天我和大家一起学习一下,如何简单实现一个溶解效果的Shader。

 1、新建Shader-Dissolve.shader文件,代码如下:

Shader "Custom/Shader-Dissolve" {

    Properties {

        _MainTex ("Albedo (RGB)", 2D) = "white" {}

        _DissolveTex("Sub(RGB)",2D)="white"{}

        _EdgeColor("Main Color",Color)=(1,1,1,1)

        _EdgeValue("Dissolve Range",Range(0,1))=0.1

        _AddColor ("Add Color",Color)=(1,1,1,1)

        _UserColorValue("UserColorSpeed",Range(0,1))=0.2 

    }

    SubShader

    {

      Pass

      {

       CGPROGRAM

       #include "UnityCG.cginc" //引用unity 自带的一些方法

       #pragma vertex vert //定义顶点着色器函数

       #pragma fragment frag //定义片元着色器函数


       sampler2D _MainTex;

       float4 _MainColor;

       sampler2D _DissolveTex;

       float4 _EdgeColor;

       float4  _AddColor;

       float _EdgeValue;

       float _UserColorValue;

       float4 _DissColor;

       struct a2v //表示这个结构体 是需要用到顶点函数的

       {

         float4 position:POSITION;

         float2 uv:TEXCOORD0;

       };

       struct v2f//表示顶点函数的返回值作为参数传递

       {

        float4 sv_position:SV_POSITION;

        float2 sv_uv:TEXCOORD0;

       };


       v2f vert (a2v i)//顶点函数

       {

         v2f o;

         o.sv_position = UnityObjectToClipPos(i.position);

         o.sv_uv =i.uv;

         return o;

       }

       float4 frag(v2f v):SV_TARGET

       {

         float4 mainTex= tex2D (_MainTex,v.sv_uv);

         float dissolveValue=tex2D (_DissolveTex,v.sv_uv).r;

         float clipValue =dissolveValue-_UserColorValue;

         clip(clipValue);

         if(clipValue>0 && clipValue<_EdgeValue)

         {

           float4 colors =lerp(_DissColor,_AddColor,(clipValue/_EdgeValue)*2);

           mainTex=colors;

         }

         return mainTex;

       }


       ENDCG

       }

    }

}

2、最后测试效果,如图示:


你可能感兴趣的:(Shader 学习之路-实现溶解效果的Shader(十一))