简单的Logo流光效果

游戏开发中,经常会用到在封面对LOGO之类的图片进行流光特效,所以参考【Unity技巧】LOGO闪光效果这篇文章修改了一个细节。
博主原来的代码使用后,会发现

这个属性中得_FlashColor并没有改变值,应该是博主写
void surf (Input IN, inout SurfaceOutput o)
时并没有处理正确?(我仅仅是猜测,因为发现用博主的shader,图片特别暗),所以对代码段进行了修改

        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.Emission = texCol.rgb + _FlashColor.rgb * brightness;//改为输出Emission,不受光影响,这个是新增的。
            o.Alpha = texCol.a;

这样在使用流光特效的时候,流光就正常了,而且流光的颜色也可以在材质球中动态修改了。
贴一下完整代码,供大家参考,当然这个效果还没在手机端测试,应该问题不会很大。如果发现有渲染问题,那应该是缓存器之类的溢出?等有时间了把这段shader优化一下。

Shader "Custom/LogoShader" { 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" } LOD 200 Blend SrcAlpha OneMinusSrcAlpha //指定alphaBlend 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; 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.Emission = texCol.rgb + _FlashColor.rgb * brightness;//改为输出Emission,不受光影响 o.Alpha = texCol.a; } ENDCG } FallBack "Diffuse" // FallBack "Unlit/Transparent"

效果演示:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值