写在前面
本文参考了风宇冲的博文,,在按照这篇博文实现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.0sampler2D _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"}
如若今生再相见,哪怕流离百世,迷途千年,也愿。