游戏开发中,经常会用到在封面对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"
效果演示:
