unity shader LOGO闪光效果
2020-06-29 16:50
344 查看
Shader "Custom/LOGOFlowLight" { Properties{ _MainTex("Texture", 2D) = "white" { } } SubShader { Tags {"Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent"} Blend SrcAlpha OneMinusSrcAlpha AlphaTest Greater 0.1 pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" sampler2D _MainTex; float4 _MainTex_ST; struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; }; //顶点函数没什么特别的,和常规一样 v2f vert(appdata_base v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.texcoord,_MainTex); return o; } //必须放在使用其的 frag函数之前,否则无法识别。 //核心:计算函数,角度,uv,光带的x长度,间隔,开始时间,偏移,单次循环时间 float inFlash(float angle,float2 uv,float xLength,int interval,int beginTime, float offX, float loopTime) { //亮度值 float brightness = 0; //倾斜角 float angleInRad = 0.0174444 * angle; //当前时间 float currentTime = _Time.y; //获取本次光照的起始时间 int currentTimeInt = _Time.y / interval; currentTimeInt *= interval; //获取本次光照的流逝时间 = 当前时间 - 起始时间 float currentTimePassed = currentTime - currentTimeInt; if (currentTimePassed > beginTime) { //底部左边界和右边界 float xBottomLeftBound; float xBottomRightBound; //此点边界 float xPointLeftBound; float xPointRightBound; float x0 = currentTimePassed - beginTime; x0 /= loopTime; //设置右边界 xBottomRightBound = x0; //设置左边界 xBottomLeftBound = x0 - xLength; //投影至x的长度 = y/ tan(angle) float xProjL; xProjL = (uv.y) / tan(angleInRad); //此点的左边界 = 底部左边界 - 投影至x的长度 xPointLeftBound = xBottomLeftBound - xProjL; //此点的右边界 = 底部右边界 - 投影至x的长度 xPointRightBound = xBottomRightBound - xProjL; //边界加上一个偏移 xPointLeftBound += offX; xPointRightBound += offX; //如果该点在区域内 if (uv.x > xPointLeftBound && uv.x < xPointRightBound) { //得到发光区域的中心点 float midness = (xPointLeftBound + xPointRightBound) / 2; //趋近中心点的程度,0表示位于边缘,1表示位于中心点 float rate = (xLength - 2 * abs(uv.x - midness)) / (xLength); brightness = rate; } } brightness = max(brightness,0); //返回颜色 = 纯白色 * 亮度 float4 col = float4(1,1,1,1) *brightness; return brightness; } float4 frag(v2f i) : COLOR { float4 outp; //根据uv取得纹理颜色,和常规一样 float4 texCol = tex2D(_MainTex,i.uv); //传进i.uv等参数,得到亮度值 float tmpBrightness; tmpBrightness = inFlash(75.0f,i.uv,0.25f,5.0f,2.0f,0.15,0.7f); //图像区域,判定设置为 颜色的A > 0.5,输出为材质颜色+光亮值 //此处的条件判断视具体情况而定 if (texCol.x > 0.1&&texCol.y > 0.1&&texCol.z > 0.1) //if (texCol.w > 0.5) outp = texCol + float4(1, 1, 1, 1)*tmpBrightness; //空白区域,判定设置为 颜色的A <=0.5,输出空白 else outp = texCol; //outp = float4(0, 0, 0, 0); return outp; } ENDCG } } }
相关文章推荐
- Shader第五讲 LOGO闪光效果
- 【Unity技巧】LOGO闪光效果
- 【Unity技巧】LOGO闪光效果
- 【Unity技巧】LOGO闪光效果-----妈妈说女孩子要自立自强
- Shader第五讲:LOGO闪光效果
- Shader第五讲:LOGO闪光效果
- unity 实现遮罩效果_LOGO闪光效果
- Unity Shader-后处理:径向模糊效果
- unity shader学习笔记(十一)——Unity中的透明效果之ShaderLab中的混合命令
- UnityShader太空中的大气层效果
- [Unity]用shader实现画面呈圆形缩放的效果。
- Unity Shader之使用Cubemap实现反射效果
- Unity Mesh网格编程(三) Shader实现水面或旗帜飘扬效果
- Unity Shader 学习笔记(22) Bloom效果
- UnityShader屏幕后处理-Bloom效果(朦胧模糊)
- UnityShader入门精要学习笔记(十):透明效果-上部分
- Unity Shader-边缘光(RimLight)效果
- Unity Shader入门精要学习笔记 - 第12章 屏幕后处理效果
- Unity Shader之使用Cubemap实现反射效果
- Unity Shader-非主流纹理采样研究(流光,溶解,隐身效果)