普通的Shader-物体移动身后残影的一种实现

思路:在网上看到的一种思路,物体移动时,对移动方向相反的物体顶点进行一个偏移,来实现残影的效果
相关文章:
顶点偏移
目前的问题:
只适用单个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 ""
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值