博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Unity技巧】LOGO闪光效果
阅读量:5885 次
发布时间:2019-06-19

本文共 3538 字,大约阅读时间需要 11 分钟。

写在前面

本文参考了,在按照这篇博文实现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实现LOGO闪光效果比脚本实现(用一张闪光图,在脚本中控制UV坐标来实现)的资源消耗要大很多,因此实际中不建议这样使用。

转载于:https://www.cnblogs.com/xiaowangba/p/6314693.html

你可能感兴趣的文章
PMP备考总结_9.13
查看>>
linux 网站架设调优Apache(三)
查看>>
在32位Win7下安装MySQL5.7.10安装配置过程
查看>>
squid透明代理和反向代理配置过程
查看>>
汽车常识全面介绍 - 传动系统
查看>>
vim攻略
查看>>
51CTO交流摘录(1):SOC的定义、适用性和组成
查看>>
关于数据包分析中Fragment offset(分片偏移)字段的十六进制码解读
查看>>
suse linux 安装无线网卡驱动
查看>>
jetty9系列之应用部署
查看>>
我的友情链接
查看>>
Linux:linux压缩文件解析
查看>>
OSChina 周四乱弹 ——解读揭秘动弹惨案
查看>>
Java程序员集合框架面试题
查看>>
双飞翼布局和常见三角
查看>>
[10秒学会] - iOS 网络检测(如需要更详细 请用Reachability)
查看>>
理解Golang包导入
查看>>
category && extension 介绍
查看>>
Keil5可以打开Keil4的Project
查看>>
IntelliJ IDEA 2018.1.3 + jdk1.8 安装教程
查看>>