,,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

}

}

回退'扩散'

}

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

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • word文档无法编辑是怎么回事-
  • 华为手机怎么设置返回键(华为手机下面的三个按键设置方法)
  • lumia950怎么样(Lumia950体验分享)
  • otg连接是什么意思(OTG连接手机方法)
  • 笔记本触摸板怎么右键(笔记本电脑触控板手势操作设置)
  • 真我x7怎么样(realme X7 系列体验)
  • 苹果的A16处理器有多强(苹果的A16处理器的介绍)
  • 小米互传怎么用(小米手机的连接与共享教程)
  • 怎么设置电脑桌面图标自动对齐 设置电脑桌面自动整理图标的方法
  • 宽带错误651最简单解决方法(处理宽带错误651的措施)
  • 大学生手机有什么推荐(大学生换手机攻略)
  • 天玑1100和骁龙778g哪个好(骁龙778G、天玑900、天玑1100购选建议)
  • yum update 升级报错的解决办法
  • Windows10禁用屏保教程
  • 连接wifi显示无互联网连接怎么办(无线连上了却不能上网处理绝招)
  • 留言与评论(共有 条评论)
       
    验证码: