我们都知道在游戏中,对于物体被溶解的效果,如降落伞溶解、纸张溶解销毁等,还是挺常见的,今天我和大家一起学习一下,如何简单实现一个溶解效果的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、最后测试效果,如图示:
网友评论