这篇文章主要为大家详细介绍了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
}
}
回退'扩散'
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。