Unity3D Shader:碰撞波纹

Shader "Unlit/Test"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_MainColor("Color",COLOR)=(1,1,1,1)
_RingColor("RingColor",COLOR)=(1,1,1,1)
_RingColorIntensity("RingColorIntensity",float)=2
_RingSpeed("RingSpeed",float)=1
_RingWidth("RingWidth",float)=0.1
_RingRangeScale("RingRangeScale",float)=1
_RingTex("RingTex",2D)="white"{}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100


CGPROGRAM


#pragma surface surf Standard fullforwardshadows
#pragma target 3.0


sampler2D _MainTex;
sampler2D _RingTex;


struct Input
{
float3 worldPos;
float2 uv_MainTex;
};


float4 _HitPs[20]; //传入碰撞的世界空间坐标,w值为碰撞的时间点
float _Power[20]; //碰撞的力的大小


float4 _MainColor;
float4 _RingColor;
float _RingColorIntensity;
float _RingSpeed;
float _RingWidth;
float _RingRangeScale;


void surf(Input IN,inout SurfaceOutputStandard o)
{
fixed4 c=tex2D(_MainTex,IN.uv_MainTex)*_MainColor;
o.Albedo=c.rgb;


half DiffRingCol=abs(o.Albedo.r-_RingColor.r)+abs(o.Albedo.g-_RingColor.g)+abs(o.Albedo.b-_RingColor.b);


for(int i=0;i<20;i++)
{
half d=distance(_HitPs[i],IN.worldPos);
half po=_Power[i]*_RingRangeScale;
half val=(1-(d/po));


if(d<(_Time.y-_HitPs[i].w)*_RingSpeed && d>(_Time.y-_HitPs[i].w)*_RingSpeed-_RingWidth && val>0)
{
half posInRing=(d-((_Time.y-_HitPs[i].w)*_RingSpeed-_RingWidth))/_RingWidth;


float angle=acos(dot(normalize(IN.worldPos-_HitPs[i]),float3(1,0,0)));


val*=tex2D(_RingTex,half2(1-posInRing,angle));
half3 col=_RingColor*val+c*(1-val);


half colRingCol=abs(col.r-_RingColor.r)+abs(col.g-_RingColor.g)+abs(col.b-_RingColor.b);
if(colRingCol<DiffRingCol)
{
DiffRingCol=colRingCol;
o.Albedo.r=col.r;
o.Albedo.g=col.g;
o.Albedo.b=col.b;
o.Albedo*=_RingColorIntensity;
}
}
}
}
ENDCG
}
FallBack "Diffuse"

}



猜你喜欢

转载自blog.csdn.net/weixin_42452001/article/details/80875883