写在前面

本文参考了风宇冲的博文,在按照这篇博文实现LOGO闪光时,发现了一些问题。最严重的就是背景无法透明,看上去背景始终是黑色的;其次就是各个变量的意义不是非常明确,调节起来不方便;而且在闪光条的角度处理上考虑不全,在角度为钝角时会有Bug。

这篇文章针对上面的问题修改了该Shader,并将各个变量作为Shader面板中的可调节变量,可视化编辑闪光效果。

代码

Shader "Custom/LogoFlash" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_FlashColor ("Flash Color", Color) = (1,1,1,1)
_Angle ("Flash Angle", Range(0, 180)) = 45
_Width ("Flash Width", Range(0, 1)) = 0.2
_LoopTime ("Loop Time", Float) = 1
_Interval ("Time Interval", Float) = 3
// _BeginTime ("Begin Time", Float) = 2
}
SubShader
{
Tags { "Queue"="Transparent" "RenderType"="Transparent" } CGPROGRAM
#pragma surface surf Lambert alpha exclude_path:prepass noforwardadd
// #pragma target 3.0 sampler2D _MainTex;
float4 _FlashColor;
float _Angle;
float _Width;
float _LoopTime;
float _Interval;
// float _BeginTime; struct Input
{
half2 uv_MainTex;
}; float inFlash(half2 uv)
{
float brightness = 0; float angleInRad = 0.0174444 * _Angle;
float tanInverseInRad = 1.0 / tan(angleInRad); // float currentTime = _Time.y - _BeginTime;
float currentTime = _Time.y;
float totalTime = _Interval + _LoopTime;
float currentTurnStartTime = (int)((currentTime / totalTime)) * totalTime;
float currentTurnTimePassed = currentTime - currentTurnStartTime - _Interval; bool onLeft = (tanInverseInRad > 0);
float xBottomFarLeft = onLeft? 0.0 : tanInverseInRad;
float xBottomFarRight = onLeft? (1.0 + tanInverseInRad) : 1.0; float percent = currentTurnTimePassed / _LoopTime;
float xBottomRightBound = xBottomFarLeft + percent * (xBottomFarRight - xBottomFarLeft);
float xBottomLeftBound = xBottomRightBound - _Width; float xProj = uv.x + uv.y * tanInverseInRad; if(xProj > xBottomLeftBound && xProj < xBottomRightBound)
{
brightness = 1.0 - abs(2.0 * xProj - (xBottomLeftBound + xBottomRightBound)) / _Width;
} return brightness;
} void surf (Input IN, inout SurfaceOutput o)
{
half4 texCol = tex2D(_MainTex, IN.uv_MainTex);
float brightness = inFlash(IN.uv_MainTex); o.Albedo = texCol.rgb + _FlashColor.rgb * brightness;
o.Alpha = texCol.a;
} ENDCG
} FallBack "Unlit/Transparent"
}

编译成功后,材质面板如图所示:

各变量意义如下:

  • Base (RGB):LOGO的png图片
  • Flash Color:闪光条的光颜色
  • Flash Angle:闪光条的角度,范围是0到180°
  • Flash Width:闪光条宽度,范围是0到1.0
  • Loop Time:闪光条滚动一次的时间
  • Time Interval:两次相邻的闪光条滚动的时间间隔

效果

更新

颜色偏暗的问题

下面留言说,上述得到的效果LOGO颜色会偏暗,我原来还真没发现这个问题。。。其实这个问题很好解决,只需要在surf函数里计算颜色值的时候多乘一点参数就可以了,比如像下面这样:
o.Albedo = texCol.rgb * 1.2 + _FlashColor.rgb * brightness;

这个原理也很简单,就是让颜色更亮而已,这个方法也经常被用于Diffuse等Shader的渲染中。

更新后的效果如下:

移动平台优化的问题

上述的Shader用了非常多的计算,乘法除法之类的,这对于移动平台其实是非常消耗资源的,经常会报寄存器不够的错误。为了优化,我一开始对于乘法和除法做了好久的优化。。。包括少使用临时变量,尽量少使用除法等等。最后结果是刚刚够用。。。但是,如果在上述计算颜色时多乘一个参数,就又超过了。。。所幸的是,前几天学了Shader对手机优化的内容,可参见这篇博文,在优化了#pragma后,又重新得以运行。。。
当然,如果你面对的是PC平台,这些问题就不是问题了。只需要把下面这句话的注释去掉就可以了:
//		#pragma target 3.0

这句话表明我们可以使用更多的寄存器了。具体可见官网解释

写在最后

代码中有一个变量的相关代码被注释掉了,即_BeginTime,这个是用来控制第一次闪光的时间。
由于移动端对指令和寄存器的数码要求较高,如果添加_BeginTime及其相关操作就会超过限制,需要指明Shader Mode 3.0
实际上,用Shader实现LOGO闪光效果比脚本实现(用一张闪光图,在脚本中控制UV坐标来实现)的资源消耗要大很多,因此实际中不建议这样使用。

【Unity技巧】LOGO闪光效果的更多相关文章

  1. LOGO闪光效果

    原地址:http://cl314413.blog.163.com/blog/static/1905079762014122105235138/ 这个效果在很多LOGO及广告宣传中都会用到.商业开发的做 ...

  2. Unity 实现物体破碎效果(转)

    感谢网友分享,原文地址(How to Make an Object Shatter Into Smaller Fragments in Unity),中文翻译地址(Unity实现物体破碎效果) In ...

  3. 有趣而又被忽略的Unity技巧

    0x00 前言 本文的内容主要来自YouTube播主Brackeys的视频TOP 10 UNITY TIPS 和TOP 10 UNITY TIPS #2.在此基础上经过自己的实践和筛选之后,选择了几个 ...

  4. 【Unity技巧】自定义消息框(弹出框)

    写在前面 这一篇我个人认为还是很常用的,一开始也是实习的时候学到的,所以我觉得实习真的是一个快速学习工程技巧的途径. 提醒:这篇教程比较复杂,如果你不熟悉NGUI.iTween.C#的回调函数机制,那 ...

  5. Unity Shader实现描边效果

    http://gad.qq.com/article/detail/28346 描边效果是游戏里面非常常用的一种效果,一般是为了凸显游戏中的某个对象,会给对象增加一个描边效果.本篇文章和大家介绍下利用S ...

  6. Unity技巧集合

    地址:http://blog.csdn.net/stalendp/article/details/17114135 这篇文章将收集unity的相关技巧,会不断地更新内容. 1)保存运行中的状态 uni ...

  7. 用Unity实现时间倒退效果

    记得以前看过一个电影,叫做<独立游戏大电影>,其中有个一个游戏可以实现时间回退的功能,可以像倒带一样,十分有趣.因此我就想着用Unity也实现一个类似的简单Demo,说不定哪天会用到. 效 ...

  8. unity 实现物体破碎效果的一些方法 - 细雨淅淅

    游戏越来越接近现实的感觉,如果有一个真是的 虚拟现实设备,可能我们真的会感觉是在真实世界.场景的逼真是在渲染效果.角色AI.游戏逻辑.物理效果等等一起导致的结果.现在游戏越来越大,除了渲染,物理估计是 ...

  9. unity 实现物体破碎效果的一些方法

    游戏越来越接近现实的感觉,如果有一个真是的 虚拟现实设备,可能我们真的会感觉是在真实世界.场景的逼真是在渲染效果.角色AI.游戏逻辑.物理效果等等一起导致的结果.现在游戏越来越大,除了渲染,物理估计是 ...

随机推荐

  1. 读书笔记-《Maven实战》-2018/4/17

    第五章 坐标和依赖 1.如同笛卡尔坐标系一样,Maven也通过坐标三元素定位一个资源. <groupId>com.dengchengchao.test</groupId> &l ...

  2. ES6(es2015)新增实用方法汇总

    Array 1.map() [1,2,3,4].map(function(item, index, array){ return  item * 2; }) 对数组中的每一项执行一次回调函数,三个参数 ...

  3. 吐槽:【计算机网络与通信】.张元.高清文字版.pdf

    看了这本书的pdf,发现了一处错误,瞬间就不想再看了.新下载了谢希仁老师的<计算机网络>.

  4. CMCC验证绕过POC

    大学的时候无意间发现绕过CMCC验证的方法(贫穷使人进步...),写了段POC脚本,时过两年,漏洞应该已经失效了(我猜 --),刚刚发现有人私信问我要,都那么久了鬼还记得写的什么啊,但确实看到了又不能 ...

  5. 更快实现Android多级树形选择列表

    快速实现Android多级树形列表,这个库是在鸿洋多级树形列表demo中修改而来. 解决的问题: 1. 支持ID为int类型和String类型. 2. 支持多级复选框选中,使用只需一行代码. 3. 支 ...

  6. MySQL系列教程(三)

    mySQL集群(cluster) 这一章,我根本不打算写,因为mySQL 的 官方Cluster方案基本上都是bullshit,尤其是它的官方集群方案,竟然都无人维护了,而且mySQL集群完全可以用眼 ...

  7. ubuntu ssh 防止登陆断开

    client 端: echo -e '\nServerAliveInterval 30' >> ~/.ssh/ssh_config server 端: echo -e '\nClientA ...

  8. DrawerLayout案例

    布局文件: <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget ...

  9. Bootstrap3 栅格系统-实例:从堆叠到水平排列

    使用单一的一组 .col-md-* 栅格类,就可以创建一个基本的栅格系统,在手机和平板设备上一开始是堆叠在一起的(超小屏幕到小屏幕这一范围),在桌面(中等)屏幕设备上变为水平排列.所有"列( ...

  10. linux:如何指定进程运行的CPU

    coolshell最新的文章<性能调优攻略>在"多核CPU调优"章节,提到"我们不能任由操作系统负载均衡,因为我们自己更了解自己的程序,所以,我们可以手动地为 ...