Unity3D Shader实现流光效果

Unity3D Shader实现流光效果

这篇文章主要为大家详细介绍了Unity3D着色器实现流光效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Unity3D着色器实现流光效果的具体代码,供大家参考,具体内容如下

流光效果图:

演示工程:

//功能需求:模拟数据传送效果,高亮色块从模型上方移动到下方

//功能分析:这里采用紫外线动画的方式来实现,利用希腊字母的第一个字母贴图控制流动的形状

//利用希腊字母的第一个字母遮罩贴图,控制模型中哪些地方需要进行流动

着色器自定义/数据流效果

{

性能

{

_MainColor(主颜色,颜色)=(1,1,1,1)

_MainTex(主纹理,2D)=白色 {}

_镜面反射(镜面反射,颜色)=(1,1,1,1)

_Gloss(Gloss ),范围(0,255))=20.0

_FlowTex(Flow Tex (A),2D)=black{}

_FlowColor(流动颜色(RGBA),Color)=(1,1,1,1)

_FlowIdleTime(FlowInternal ,Range(0,10))=1.0

_FlowDuring(FlowDuring ,Range(0,10))=1.0

_FlowMaskTex(FlowMasking (A),2D)=white{}

_FlowDirection(FlowDirection ,Int)=0

_FlowBeginTime(流开始时间,浮点)=0

}

子遮光器

{

标签{ 渲染类型=不透明 队列=几何 }

及格

{

标签{LightMode=ForwardBase}

Blend SrcAlpha OneMinusSrcAlpha

CGPROGRAM

#杂注顶点垂直

#杂注片段蓄意杀伤

#包含" UnityCG.cginc "

#包含" Lighting.cginc "

sampler2D _ MainTex//颜色贴图

half4 _ MainTex _ ST//颜色紫外线缩放和偏移

fixed3 _ MainColor//漫反射颜色

已修复3 _镜面反射;//高光颜色

固定_光泽;//高光度

sampler2D _ FlowTex//数据流图片

fixed4 _ FlowColor//数据流颜色叠加

half4 _ FlowTex _ ST//数据流贴图紫外线的缩放和偏移

fixed _ FlowIdleTime//流动动画间歇时间

fixed _ FlowDuring//流动动画播放时间

sampler2D _ FlowMaskTex//流动遮罩

固定_流向;//流动方向

float _ FlowBeginTime//流动效果开始的时间

结构a2v

{

半4位置:位置;

半3正常:正常;

半4 tex coord:tex coord 0;

};

结构v2f

{

半4位置:SV _ POSITION

半2 uv:tex coord 0;

半3世界正常:tex coord 1;

半个3世界pos:tex coord 2;

半2流uv:tex coord 3;

};

v2f垂直(a2v一)

{

v2f v;

五。position=UnityObjectToClipPos(I . pos);

五。uv=I . tex coord * _ MainTex _ ST . xy _ MainTex _ ST . zw;

五。world normal=mul(unity _ ObjectToWorld,I . normal);

五。world pos=mul(unity _ ObjectToWorld,I . pos);

五。flow uv=I . tex coord * _ flow tex _ ST . xy _ flow tex _ ST . zw;

回归五;

}

//紫外线垂直的紫外线坐标

//缩放-贴图缩放

//idleTime -每次循环开始后多长时间,开始流动

//循环时间-单次流动时间

fixed4 getFlowColor(half2 uv,int scale,fixed idleTime,fixed loopTime)

{

//当前运行时间

半流动时间_=_时间。y-_流开始时间;

//上一次循环开始,到本次循环开始的时间间隔

半内部=空闲时间循环时间

//当前循环执行时间

half curLoopTime=fmod(flowTime_,internal);

//每次开始流动之前,有个停止间隔,检测是否可以流动了

if(curLoopTime idleTime)

{

//已经流动时间

半动作时间=curLoopTime-空闲时间;

//流动进度百分比

半动作百分比=动作时间/回路时间;

半长=1.0 /刻度;

//从下往上流动

//计算方式:设:y=ax b,其中y为下边界值,x为流动进度

//根据我们要求可以,x=0时y=-长度;x=1时y=1;带入解方程

下边框一半=动作百分比*(1长度)-长度;

半上边框=下边框长度;

//从上往下流动

//求解方法与上面类似

如果(_流向0)

{

上边框=(-1-长度)*行动百分比1长度;

下边框=上边框-长度;

}

如果(紫外线上边框uv.y下边框)

{

half y=(uv.y - bottomBorder) /长度;

返回tex2D(_FlowTex,fixed2(uv.x,y));

}

}

返回fixed4(1,1,1,0);

}

修正四片段(v2f v):SV_Target

{

//计算漫反射系数

fixed3 albedo=tex2D(_MainTex,v . uv)* _主色;

//计算环境光

固定3环境光=UNITY _ light模型_环境光。XYZ *反照率;

固定3世界正常=正常化(v .世界正常);//世界坐标的法线方向

固定3 worldLightDir=normalize(UnityWorldSpaceLightDir(v . world pos));//世界坐标的光照方向

固定3 world view dir=normalize(UnityWorldSpaceViewDir(v . world pos));//世界坐标的视角方向

//计算漫反射颜色,采用半朗伯模型

固定3光色=_光色0。RGB

固定3漫反射=光色*反照率*最大值(0,0.5*dot(worldNormal,world light dir)0.5);

//计算高光,采用布林电话高光模型

固定3 half dir=normalize(worldViewDir世界光dir);

固定3 spec color=_ Specular * light color * pow(max(0,dot(worldNormal,halfDir)),_ Gloss);

//叠加流动贴图

fixed 4 flow color=getflow color(v . uv,_FlowTex_ST.y,_ FlowIdleTime,_ flow during);

固定4 flowMaskColor=tex 2d(_ FlowMaskTex,v . uv);

//与遮罩贴图进行混合,只显示遮罩贴图不透明的部分

流动颜色。a=flowmaskcolor。a *流动颜色。* _流动颜色。a;

固定3最终漫射=lerp(漫射,_流动颜色,流动颜色。a);

返回已修复4(环境最终漫反射光谱颜色,1);

}

ENDCG

}

}

回退扩散

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

Unity3D Shader实现流光效果