负责特效:真牛X
Shader"MADFINGER/Transparent/BlinkingGodRaysBillboarded"{
Properties{
_MainTex("Basetexture",2D)="white"{}
_FadeOutDistNear("Nearfadeoutdist",float)=10
_FadeOutDistFar("Farfadeoutdist",float)=10000
_Multiplier("Colormultiplier",float)=1
_Bias("Bias",float)=0
_TimeOnDuration("ONduration",float)=0.5
_TimeOffDuration("OFFduration",float)=0.5
_BlinkingTimeOffsScale("Blinkingtimeoffsetscale(seconds)",float)=5
_SizeGrowStartDist("Sizegrowstartdist",float)=5
_SizeGrowEndDist("Sizegrowenddist",float)=50
_MaxGrowSize("Maxgrowsize",float)=2.5
_NoiseAmount("Noiseamount(whenzero,pulsewaveisused)",Range(0,0.5))=0
_VerticalBillboarding("Verticalbillboardingamount",Range(0,1))=1
_ViewerOffset("Vieweroffset",float)=0
_Color("Color",Color)=(1,1,1,1)
}
SubShader{
Tags{"Queue"="Transparent""IgnoreProjector"="True""RenderType"="Transparent"}
BlendOneOne
CullOffLightingOffZWriteOffFog{Color(0,0,0,0)}
LOD100
CGINCLUDE
#include"UnityCG.cginc"
sampler2D_MainTex;
float_FadeOutDistNear;
float_FadeOutDistFar;
float_Multiplier;
float_Bias;
float_TimeOnDuration;
float_TimeOffDuration;
float_BlinkingTimeOffsScale;
float_SizeGrowStartDist;
float_SizeGrowEndDist;
float_MaxGrowSize;
float_NoiseAmount;
float_VerticalBillboarding;
float_ViewerOffset;
float4_Color;
structv2f{
float4pos:SV_POSITION;
float2uv:TEXCOORD0;
fixed4color:TEXCOORD1;
};
voidCalcOrthonormalBasis(float3dir,outfloat3right,outfloat3up)
{
up=abs(dir.y)>0.999f?float3(0,0,1):float3(0,1,0);
right=normalize(cross(up,dir));
up=cross(dir,right);
}
floatCalcFadeOutFactor(floatdist)
{
floatnfadeout=saturate(dist/_FadeOutDistNear);
floatffadeout=1-saturate(max(dist-_FadeOutDistFar,0)*0.2);
ffadeout*=ffadeout;
nfadeout*=nfadeout;
nfadeout*=nfadeout;
nfadeout*=ffadeout;
returnnfadeout;
}
floatCalcDistScale(floatdist)
{
floatdistScale=min(max(dist-_SizeGrowStartDist,0)/_SizeGrowEndDist,1);
returndistScale*distScale*_MaxGrowSize;
}
v2fvert(appdata_fullv)
{
v2fo;
#if0
//cheapviewspacebillboarding
float3centerOffs=float3(float(0.5).xx-v.color.rg,0)*v.texcoord1.xyy;
float3BBCenter=v.vertex+centerOffs.xyz;
float3viewPos=mul(UNITY_MATRIX_MV,float4(BBCenter,1))-centerOffs;
#else
float3centerOffs=float3(float(0.5).xx-v.color.rg,0)*v.texcoord1.xyy;
float3centerLocal=v.vertex.xyz+centerOffs.xyz;
float3viewerLocal=mul(_World2Object,float4(_WorldSpaceCameraPos,1));
float3localDir=viewerLocal-centerLocal;
localDir[1]=lerp(0,localDir[1],_VerticalBillboarding);
floatlocalDirLength=length(localDir);
float3rightLocal;
float3upLocal;
CalcOrthonormalBasis(localDir/localDirLength,rightLocal,upLocal);
floatdistScale=CalcDistScale(localDirLength)*v.color.a;
float3BBNormal=rightLocal*v.normal.x+upLocal*v.normal.y;
float3BBLocalPos=centerLocal-(rightLocal*centerOffs.x+upLocal*centerOffs.y)+BBNormal*distScale;
BBLocalPos+=_ViewerOffset*localDir;
#endif
floattime=_Time.y+_BlinkingTimeOffsScale*v.color.b;
floatfracTime=fmod(time,_TimeOnDuration+_TimeOffDuration);
floatwave=smoothstep(0,_TimeOnDuration*0.25,fracTime)*(1-smoothstep(_TimeOnDuration*0.75,_TimeOnDuration,fracTime));
floatnoiseTime=time*(6.2831853f/_TimeOnDuration);
floatnoise=sin(noiseTime)*(0.5f*cos(noiseTime*0.6366f+56.7272f)+0.5f);
floatnoiseWave=_NoiseAmount*noise+(1-_NoiseAmount);
wave=_NoiseAmount<0.01f?wave:noiseWave;
wave+=_Bias;
o.uv=v.texcoord.xy;
o.pos=mul(UNITY_MATRIX_MVP,float4(BBLocalPos,1));
o.color=CalcFadeOutFactor(localDirLength)*_Color*_Multiplier*wave;
returno;
}
ENDCG
Pass{
CGPROGRAM
#pragmavertexvert
#pragmafragmentfrag
#pragmafragmentoptionARB_precision_hint_fastest
fixed4frag(v2fi):COLOR
{
returntex2D(_MainTex,i.uv.xy)*i.color;
}
ENDCG
}
}
}