思路:在网上看到的一种思路,物体移动时,对移动方向相反的物体顶点进行一个偏移,来实现残影的效果
相关文章:
顶点偏移
目前的问题:
只适用单个mesh,若物体含有多个mesh不适用
目前的顶点偏移是整体偏移,可以添加噪声进行扰动,效果更好一点
偏移后的颜色还可以想办法改一下,残影颜色
代码:
Shader "Mytest/MoveTestShader"{
Properties{
_MainColor("MainColor",Color)=(1,1,1,1)
_VertexColor("VertexColor",Color)=(0,0,0,0)
_Dir("Dir",Vector)=(0,0,0)//物体移动方向 世界空间
_Speed("Move Speed",float)=0//偏移程度
}
//物体向某个方向移动,身后出现残影
//给方向,方向和顶点法线点积 小于0的即为身后的点
//身后的点 向相反方向偏移 偏移量为速度
SubShader{
Pass{
Tags{"RenderType"="Opaque"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
fixed4 _MainColor;
fixed4 _VertexColor;
float3 _Dir;
float _Speed;
struct v2f{
float4 pos:SV_POSITION;
fixed isMoveVertex:TEXCOORD0;
};
v2f vert(appdata_base v){
v2f o;
//计算需要偏移的点
//_dir是世界坐标下的方向 所以需要法线的世界坐标
fixed3 worldNormal = UnityObjectToWorldNormal(v.normal);
fixed3 vertDir = -normalize(_Dir);
//顶点偏移转换到模型空间
fixed3 objDir = mul(unity_WorldToObject,vertDir);
if(dot(_Dir,worldNormal)<0){
//偏移点
v.vertex = v.vertex + float4(objDir,0)*_Speed;
o.isMoveVertex = 1.0;
}else{
o.isMoveVertex = 0;
}
o.pos = UnityObjectToClipPos(v.vertex);
return o;
}
fixed4 frag(v2f i):SV_Target{
fixed4 color ;
if(i.isMoveVertex==1){
color = _VertexColor;
}else{
color = _MainColor;
}
return color;
}
ENDCG
}
}
FallBack ""
}