源战役客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

506 lines
23 KiB

#ifndef MAINROLE_EFFECT_CG_INCLUDED
#define MAINROLE_EFFECT_CG_INCLUDED
#include "UnityCG.cginc"
struct a2v
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float3 normal:NORMAL;
float4 tangent : TANGENT;
};
struct a2v_hg
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float3 normal:NORMAL;
float4 tangent : TANGENT;
};
struct v2f
{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
float4 posWorld : TEXCOORD1;
float3 normalDir : TEXCOORD2;
float3 dir_rimlight : TEXCOORD3;
float3 dir_shadow : TEXCOORD4;
};
struct v2f_hg
{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
float4 posWorld : TEXCOORD1;
float3 normalDir : TEXCOORD2;
float4 mPos : TEXCOORD3;
};
fixed4 _Color;
float4 _ShadowDir, _RimDir;
// 通用顶点函数,主要内容为转化顶点坐标和发现坐标,以及归一化边缘方向和法线方向
v2f MainRoleVertexDefault(a2v v)
{
v2f o;
o.posWorld = mul(unity_ObjectToWorld, v.vertex);
o.pos = mul(UNITY_MATRIX_VP, o.posWorld);
o.uv = v.uv;
o.normalDir = mul((float3x3)unity_ObjectToWorld, v.normal);
o.dir_rimlight = normalize(_RimDir.xyz);
o.dir_shadow = normalize(_ShadowDir.xyz);
return o;
}
float4 _HologramGliterData1, _HologramGliterData2;
float3 VertexHologramOffset(float3 vertex, half4 offsetData)
{
float speed = offsetData.x;
float range = offsetData.y;
float offset = offsetData.z;
float frequency = offsetData.w;
float offset_time = sin(_Time.y * speed);
// step(y, x) 如果 x >= y 则返回1,否则返回0
float timeToGliter = step(frequency, offset_time);
float gliterPosY = sin(vertex.x + _Time.z);
float gliterPosYRange = step(0, gliterPosY) * step(gliterPosY, range);
// 获取偏移量
float res = gliterPosYRange * offset * timeToGliter * gliterPosY;
// 将这个偏移量定义为视角坐标的偏移量,再转到模型坐标
float3 view_offset = float3(res, 0, 0);
return mul((float3x3)UNITY_MATRIX_T_MV, view_offset);
}
v2f_hg MainRoleHologramMaskVertex(a2v_hg v)
{
v2f_hg o;
// 产生模型顶点方向上的扭曲系数
v.vertex.xyz += VertexHologramOffset(v.vertex.xyz, _HologramGliterData1);
v.vertex.xyz += VertexHologramOffset(v.vertex.xyz, _HologramGliterData2);
o.posWorld = mul(unity_ObjectToWorld, v.vertex);
o.pos = mul(UNITY_MATRIX_VP, o.posWorld);
o.uv = v.uv;
o.normalDir = mul((float3x3)unity_ObjectToWorld, v.normal);
return o;
}
// 全息专用顶点函数,相比于通用顶点函数多了顶点偏移的逻辑
v2f_hg MainRoleHologramVertex(a2v_hg v)
{
v2f_hg o;
// 产生模型顶点方向上的扭曲系数
v.vertex.xyz += VertexHologramOffset(v.vertex.xyz, _HologramGliterData1);
v.vertex.xyz += VertexHologramOffset(v.vertex.xyz, _HologramGliterData2);
o.mPos = v.vertex;
o.posWorld = mul(unity_ObjectToWorld, v.vertex);
o.pos = mul(UNITY_MATRIX_VP, o.posWorld);
o.uv = v.uv;
o.normalDir = mul((float3x3)unity_ObjectToWorld, v.normal);
return o;
}
// MainRole参数
sampler2D _MainTex, _Mask, _MatcapTex;
float4 _AmbientColor, _SunColor, _BrightShadow, _DarkShadow, _RimColor;
float _Shadownol1, _Shadownol2, _MatcapScale1, _MatcapScale2;
// 溶解效果参数
sampler2D _DissolveMap;
float4 _DissolveMap_ST;
fixed4 _DissolveFadeInColor, _DissolveFadeMidColor, _DissolveFadeOutColor;
fixed _DissolveThreshold, _DissolveFadeInThreshold, _DissolveFadeMidThreshold, _DissolveFadeOutThreshold;
// 全息效果
sampler2D _HologramGlitchMap;
fixed4 _HologramColor;
half _HologramAlpha;
half _HologramColorGlitchTog, _HologramColorGlitch, _HologramColorGlitchMin;
half4 _HologramColorGlitchData;
// 全息菲涅尔
half _FresnelScale, _FresnelPower, _FresnelAlphaScale, _FresnelAlphaPower;
// 全息扫描线
sampler2D _HologramLine1;
half _HologramLine1Speed, _HologramLine1Frequency, _HologramLine1Alpha;
sampler2D _HologramLine2;
half _HologramLine2Speed, _HologramLine2Frequency, _HologramLine2Alpha;
// 全息颜色颗粒
half4 _HologramGrainData;
half _HologramGrainSpeed, _HologramGrainAffect;
// 全息蒙版
sampler2D _HologramMaskMap;
half _HologramMaskAffect, _HologramMaskUseAxis, _HologramYMask;
float4 _HologramMaskMap_ST;
// 全息+溶解参数
fixed4 _AlphaTexColor;
float _ModelHeightButton, _ModelHeightTop, _DissolveFadeGap;
fixed _ReverseDissolveDirection;
float4 MainRoleOpaqueFragment(v2f i) : SV_Target
{
float3 mainColor = tex2D(_MainTex, i.uv).rgb;
#if defined(_USE_DISSOLVE_EFFECT)
// 不满足阈值的片元直接舍弃
#if defined (_USE_DISSOLVE_MAP)
float2 dissolve_uv = TRANSFORM_TEX(i.uv, _DissolveMap);
fixed4 dissolveValue = tex2D(_DissolveMap, dissolve_uv);
if (dissolveValue.r < _DissolveThreshold)
#else
if (mainColor.r < _DissolveThreshold)
#endif
{
discard;
}
#endif
float3 diffuse_fac = _SunColor + _AmbientColor.xyz;
float3 diffuse = mainColor * 0.5 * 1.2784 * diffuse_fac;
float3 N = normalize(i.normalDir);
float3 L = i.dir_shadow.xyz;
float4 resultColor;
float3 V = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);
float NdotView = clamp(dot(N, V), 0.0, 1.0);
float NdotshadowFactor = clamp(dot(L, N), 0.0, 1.0);
float RimlightDotValue = clamp(dot(i.dir_rimlight, N), 0.0, 1.0);
float Ndotshadow = smoothstep(_Shadownol1, _Shadownol2, NdotshadowFactor);
float dif_illum = dot(diffuse, float3(0.299, 0.587, 0.114));
float shadowshift = smoothstep(0.25, 0.74, dif_illum);
float3 shadowColor = lerp(_DarkShadow.rgb, _BrightShadow.rgb, shadowshift);
float3 baseColor = lerp(shadowColor * diffuse.rgb, diffuse.rgb, Ndotshadow);
float rimdot = clamp(RimlightDotValue * (1.0 - NdotView), 0.0, 1.0);
float rimffcal = smoothstep(0.35, 0.58, rimdot);
float3 rim = rimffcal * diffuse * _RimColor.rgb;
resultColor.rgb = baseColor + rim;
float3 maskTemp = tex2D(_Mask, i.uv).rgb;
float2 matcapuv = mul((float3x3)UNITY_MATRIX_V, N).xy;
matcapuv.y = -matcapuv.y;
matcapuv = matcapuv * 0.5 + 0.5;
float3 matColor1 = tex2D(_MatcapTex, float2(matcapuv.x * 0.5, matcapuv.y)).rgb;
float3 matColor2 = tex2D(_MatcapTex, float2(matcapuv.x * 0.5 + 0.5, matcapuv.y)).rgb;
float matColor = (matColor1 * maskTemp.x * _MatcapScale1 + matColor2 * maskTemp.y * _MatcapScale2);
resultColor.rgb += (matColor * diffuse + maskTemp.z * diffuse);
resultColor.a = 1;
resultColor *= _Color;
#if defined(_USE_DISSOLVE_EFFECT)
// 溶解相关
// percentage 讲道理不会大于1的,大于1的情况上面就被迪斯咯的了,但pectange的整体趋势是随着_DissolveThreshold增加而增加这个是肯定的
#if defined (_USE_DISSOLVE_MAP)
fixed percentage = _DissolveThreshold / max(dissolveValue.r, 0.0001);
#else
fixed percentage = _DissolveThreshold / max(mainColor.r, 0.0001);
#endif
// 设置 溶解颜色->完全消融 的颜色过度
// sign 根据范围返回一个标志,分别是小于0时返回-1,大于0时返回1,否则返回0(不过这里被优化掉了)
fixed fadeOutEdge = saturate(1000.0 * (percentage - _DissolveFadeOutThreshold));
fixed3 fadeOutEdgeColor = lerp(_DissolveFadeMidColor.rgb, _DissolveFadeOutColor.rgb, fadeOutEdge);
// 设置 开始溶解->溶解颜色 的颜色过度
fixed fadeMidAmount = saturate(1000.0 * (percentage - _DissolveFadeMidThreshold));
fixed3 fadeMidAmountColor = lerp(_DissolveFadeInColor.rgb, fadeOutEdgeColor.rgb, fadeMidAmount);
// 设置 源颜色->开始溶解 的颜色过度
fixed fadeInEdge = saturate(1000.0 * (percentage - _DissolveFadeInThreshold));
resultColor.rgb = lerp(resultColor.rgb, fadeMidAmountColor, fadeInEdge);
#endif
return resultColor;
}
float4 MainRoleTransparentFragment(v2f i) : SV_Target
{
float4 mainColor = tex2D(_MainTex, i.uv);
#if defined(_USE_DISSOLVE_EFFECT)
// 不满足阈值的片元直接舍弃
#if defined (_USE_DISSOLVE_MAP)
float2 dissolve_uv = TRANSFORM_TEX(i.uv, _DissolveMap);
fixed4 dissolveValue = tex2D(_DissolveMap, dissolve_uv);
if (dissolveValue.r < _DissolveThreshold)
#else
if (mainColor.r < _DissolveThreshold)
#endif
{
discard;
}
#endif
float3 diffuse_fac = _SunColor + _AmbientColor.xyz;
float3 diffuse = mainColor.rgb * 0.5 * 1.2784 * diffuse_fac;
float3 N = normalize(i.normalDir);
float3 L = i.dir_shadow.xyz;
float4 resultColor;
float3 V = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);
float NdotView = clamp(dot(N, V), 0.0, 1.0);
float NdotshadowFactor = clamp(dot(L, N), 0.0, 1.0);
float RimlightDotValue = clamp(dot(i.dir_rimlight, N), 0.0, 1.0);
float Ndotshadow = smoothstep(_Shadownol1, _Shadownol2, NdotshadowFactor);
float dif_illum = dot(diffuse, float3(0.299, 0.587, 0.114));
float shadowshift = smoothstep(0.25, 0.74, dif_illum);
float3 shadowColor = lerp(_DarkShadow.rgb, _BrightShadow.rgb, shadowshift);
float3 baseColor = lerp(shadowColor * diffuse.rgb, diffuse.rgb, Ndotshadow);
float rimdot = clamp(RimlightDotValue * (1.0 - NdotView), 0.0, 1.0);
float rimffcal = smoothstep(0.35, 0.58, rimdot);
float3 rim = rimffcal * diffuse * _RimColor.rgb;
resultColor.rgb = baseColor + rim;
float3 maskTemp = tex2D(_Mask, i.uv).rgb;
float2 matcapuv = mul((float3x3)UNITY_MATRIX_V, N).xy;
matcapuv.y = -matcapuv.y;
matcapuv = matcapuv * 0.5 + 0.5;
float3 matColor1 = tex2D(_MatcapTex, float2(matcapuv.x * 0.5, matcapuv.y)).rgb;
float3 matColor2 = tex2D(_MatcapTex, float2(matcapuv.x * 0.5 + 0.5, matcapuv.y)).rgb;
float matColor = (matColor1 * maskTemp.x * _MatcapScale1 + matColor2 * maskTemp.y * _MatcapScale2);
resultColor.rgb += (matColor * diffuse + maskTemp.z * diffuse);
resultColor.a = mainColor.a;
resultColor *= _Color;
#if defined(_USE_DISSOLVE_EFFECT)
// 溶解相关
// percentage 讲道理不会大于1的,大于1的情况上面就被迪斯咯的了,但pectange的整体趋势是随着_DissolveThreshold增加而增加这个是肯定的
#if defined (_USE_DISSOLVE_MAP)
fixed percentage = _DissolveThreshold / max(dissolveValue.r, 0.0001);
#else
fixed percentage = _DissolveThreshold / max(mainColor.r, 0.0001);
#endif
// 设置 溶解颜色->完全消融 的颜色过度
// sign 根据范围返回一个标志,分别是小于0时返回-1,大于0时返回1,否则返回0(不过这里被优化掉了)
fixed fadeOutEdge = saturate(1000.0 * (percentage - _DissolveFadeOutThreshold));
fixed3 fadeOutEdgeColor = lerp(_DissolveFadeMidColor.rgb, _DissolveFadeOutColor.rgb, fadeOutEdge);
// 设置 开始溶解->溶解颜色 的颜色过度
fixed fadeMidAmount = saturate(1000.0 * (percentage - _DissolveFadeMidThreshold));
fixed3 fadeMidAmountColor = lerp(_DissolveFadeInColor.rgb, fadeOutEdgeColor.rgb, fadeMidAmount);
// 设置 源颜色->开始溶解 的颜色过度
fixed fadeInEdge = saturate(1000.0 * (percentage - _DissolveFadeInThreshold));
resultColor.rgb = lerp(resultColor.rgb, fadeMidAmountColor, fadeInEdge);
#endif
return resultColor;
}
float SampleNoiseMap(float2 uv)
{
return tex2D(_HologramGlitchMap, uv).r;
}
float4 MainRoleHologramMaskFragment(v2f_hg i) : SV_Target
{
return 1;
}
float4 MainRoleHologramFragment(v2f_hg i) : SV_Target
{
float4 main_color = _HologramColor;
// 用主纹理的r通道做颜色蒙版
float2 mask_uv = i.uv.xy * _HologramMaskMap_ST.xy + _HologramMaskMap_ST.zw;
float4 mask = tex2D(_HologramMaskMap, mask_uv);
float mask_alpha = lerp(1, mask.b, _HologramMaskAffect);
#if defined(_USE_DISSOLVE_EFFECT)
// 不满足阈值的片元直接舍弃
#if defined (_USE_DISSOLVE_MAP)
float2 dissolve_uv = TRANSFORM_TEX(i.uv, _DissolveMap);
fixed4 dissolveValue = tex2D(_DissolveMap, dissolve_uv);
if (dissolveValue.r < _DissolveThreshold)
#else
if (mask_alpha < _DissolveThreshold)
#endif
{
discard;
}
#endif
// 全息颜色故障效果处理
float color_glicth_noise = SampleNoiseMap(float2(_Time.x * _HologramColorGlitchData.x, _Time.x * _HologramColorGlitchData.y));
color_glicth_noise = color_glicth_noise * (1.0 - _HologramColorGlitchMin) + _HologramColorGlitchMin;
color_glicth_noise = clamp(color_glicth_noise, 0.0, 1.0);
float color_glitch = lerp(1.0, color_glicth_noise, _HologramColorGlitch * _HologramColorGlitchTog);
// 菲涅尔反射
float3 w_viewDir = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);;
float3 w_normal = normalize(i.normalDir);
float nDotV = dot(w_normal, w_viewDir);
float rim_nDotV = 1.0 - nDotV;
float fresnel = _FresnelScale * pow(rim_nDotV, _FresnelPower);
float fresnel_alpha = clamp(_FresnelAlphaScale * pow(rim_nDotV, _FresnelAlphaPower), 0.0, 1.0);
float4 fresnel_color = (float4(fresnel, fresnel, fresnel, 1.0) * float4(main_color.rgb, 1.0)) * fresnel_alpha;
float3 mask_color = tex2D(_MainTex, i.uv).r;
// 全息效果 扫描线
float2 line1_uv = (i.posWorld.y * _HologramLine1Frequency + _Time.y * _HologramLine1Speed).xx;
float line1 = clamp(tex2D(_HologramLine1, line1_uv).r, 0.0, 1.0);
float4 line1_color = float4((main_color * line1).rgb, line1) * _HologramLine1Alpha;
float line1_alpha = clamp(((main_color).a + (line1_color).w), 0.0 , 1.0);
#if defined (_USE_SCANLINE2)
float2 line2_uv = (i.posWorld.y * _HologramLine2Frequency + _Time.y * _HologramLine2Speed).xx;
float line2 = clamp(tex2D(_HologramLine2, line2_uv).r, 0.0, 1.0);
float4 line2_color = float4((main_color * line2).rgb, line2) * _HologramLine2Alpha;
float line2_alpha = clamp(((main_color).a + (line2_color).w), 0.0 , 1.0);
#else
float4 line2_color = 0.0;
float line2_alpha = 1.0;
#endif
// Grain 颗粒效果
float grain_noise = SampleNoiseMap((i.posWorld.xy * _HologramGrainData.xy + _Time.y * _HologramGrainSpeed));
float lerp_val = lerp(_HologramGrainData.z, _HologramGrainData.w, grain_noise);
float grain_amount = lerp(0.0, lerp_val, _HologramGrainAffect);
float4 resultColor = float4(
((main_color + fresnel_color + float4(line1_color.xyz + line2_color.xyz, 0.0) + grain_amount)).rgb,
(line1_alpha * line2_alpha * mask_alpha * _HologramAlpha)) * color_glitch;
#if defined(_USE_DISSOLVE_EFFECT)
// 溶解相关
// percentage 讲道理不会大于1的,大于1的情况上面就被迪斯咯的了,但pectange的整体趋势是随着_DissolveThreshold增加而增加这个是肯定的
#if defined (_USE_DISSOLVE_MAP)
fixed percentage = _DissolveThreshold / max(dissolveValue.r, 0.0001);
#else
fixed percentage = _DissolveThreshold / max(mask_alpha, 0.0001);
#endif
// 设置 溶解颜色->完全消融 的颜色过度
// sign 根据范围返回一个标志,分别是小于0时返回-1,大于0时返回1,否则返回0(不过这里被优化掉了)
fixed fadeOutEdge = saturate(1000.0 * (percentage - _DissolveFadeOutThreshold));
fixed3 fadeOutEdgeColor = lerp(_DissolveFadeMidColor.rgb, _DissolveFadeOutColor.rgb, fadeOutEdge);
// 设置 开始溶解->溶解颜色 的颜色过度
fixed fadeMidAmount = saturate(1000.0 * (percentage - _DissolveFadeMidThreshold));
fixed3 fadeMidAmountColor = lerp(_DissolveFadeInColor.rgb, fadeOutEdgeColor.rgb, fadeMidAmount);
// 设置 源颜色->开始溶解 的颜色过度
fixed fadeInEdge = saturate(1000.0 * (percentage - _DissolveFadeInThreshold));
resultColor.rgb = lerp(resultColor.rgb, fadeMidAmountColor, fadeInEdge);
#endif
float mask_use_axis = i.mPos[(uint)_HologramMaskUseAxis];
float mask_lerp_amount = mask_use_axis - _HologramYMask;
resultColor.a = clamp(lerp(resultColor.a, 0, mask_lerp_amount), 0.0, resultColor.a);
return resultColor;
}
v2f_hg CombineHologramAndAlphaTextureVertex(a2v_hg v)
{
v2f_hg o;
#if defined(_USE_DISSOLVE_EFFECT)
// 产生模型顶点方向上的扭曲系数
float mask_use_axis = v.vertex[(uint)_HologramMaskUseAxis];
fixed dir = -2 * _ReverseDissolveDirection + 1;
float height_progressMid = lerp(_ModelHeightButton, _ModelHeightTop, _DissolveThreshold);
float fadeMidAmount = saturate(1000.0 * (dir * mask_use_axis - height_progressMid)); // * 1000的作用是优化掉sign,避免可能产生的编译分支问题
fixed vertex_amount = lerp(1.0, 0.0, fadeMidAmount);
v.vertex.xyz += vertex_amount * VertexHologramOffset(v.vertex.xyz, _HologramGliterData1);
v.vertex.xyz += vertex_amount * VertexHologramOffset(v.vertex.xyz, _HologramGliterData2);
#else
v.vertex.xyz += VertexHologramOffset(v.vertex.xyz, _HologramGliterData1);
v.vertex.xyz += VertexHologramOffset(v.vertex.xyz, _HologramGliterData2);
#endif
o.mPos = v.vertex;
o.posWorld = mul(unity_ObjectToWorld, v.vertex);
o.pos = mul(UNITY_MATRIX_VP, o.posWorld);
o.uv = v.uv;
o.normalDir = mul((float3x3)unity_ObjectToWorld, v.normal);
return o;
}
float4 CombineHologramAndAlphaTextureFragment(v2f_hg i) : SV_Target
{
float4 main_color = _HologramColor;
// 用主纹理的r通道做全息颜色蒙版
float2 mask_uv = i.uv.xy * _HologramMaskMap_ST.xy + _HologramMaskMap_ST.zw;
float4 mask = tex2D(_HologramMaskMap, mask_uv);
float channel_max = max(max(mask.r, mask.g), mask.b);
float mask_alpha = lerp(1, channel_max, _HologramMaskAffect);
#if defined(_USE_DISSOLVE_EFFECT) || defined (_USE_DISSOLVE_MAP)
float2 dissolve_uv = TRANSFORM_TEX(i.uv, _DissolveMap);
fixed4 dissolveValue = tex2D(_DissolveMap, dissolve_uv);
#endif
// 全息颜色故障效果处理
float color_glicth_noise = SampleNoiseMap(float2(_Time.x * _HologramColorGlitchData.x, _Time.x * _HologramColorGlitchData.y));
color_glicth_noise = color_glicth_noise * (1.0 - _HologramColorGlitchMin) + _HologramColorGlitchMin;
color_glicth_noise = clamp(color_glicth_noise, 0.0, 1.0);
float color_glitch = lerp(1.0, color_glicth_noise, _HologramColorGlitch * _HologramColorGlitchTog);
// 菲涅尔反射
float3 w_viewDir = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);;
float3 w_normal = normalize(i.normalDir);
float nDotV = dot(w_normal, w_viewDir);
float rim_nDotV = 1.0 - nDotV;
float fresnel = _FresnelScale * pow(rim_nDotV, _FresnelPower);
float fresnel_alpha = clamp(_FresnelAlphaScale * pow(rim_nDotV, _FresnelAlphaPower), 0.0, 1.0);
float4 fresnel_color = (float4(fresnel, fresnel, fresnel, 1.0) * float4(main_color.rgb, 1.0)) * fresnel_alpha;
float3 mask_color = tex2D(_MainTex, i.uv).r;
// 全息效果 扫描线
float2 line1_uv = (i.posWorld.y * _HologramLine1Frequency + _Time.y * _HologramLine1Speed).xx;
float line1 = clamp(tex2D(_HologramLine1, line1_uv).r, 0.0, 1.0);
float4 line1_color = float4((main_color * line1).rgb, line1) * _HologramLine1Alpha;
float line1_alpha = clamp(((main_color).a + (line1_color).w), 0.0 , 1.0);
#if defined (_USE_SCANLINE2)
float2 line2_uv = (i.posWorld.y * _HologramLine2Frequency + _Time.y * _HologramLine2Speed).xx;
float line2 = clamp(tex2D(_HologramLine2, line2_uv).r, 0.0, 1.0);
float4 line2_color = float4((main_color * line2).rgb, line2) * _HologramLine2Alpha;
float line2_alpha = clamp(((main_color).a + (line2_color).w), 0.0 , 1.0);
#else
float4 line2_color = 0.0;
float line2_alpha = 1.0;
#endif
// Grain 颗粒效果
float grain_noise = SampleNoiseMap((i.posWorld.xy * _HologramGrainData.xy + _Time.y * _HologramGrainSpeed));
float lerp_val = lerp(_HologramGrainData.z, _HologramGrainData.w, grain_noise);
float grain_amount = lerp(0.0, lerp_val, _HologramGrainAffect);
float4 hologram_color = float4(
((main_color + fresnel_color + float4(line1_color.xyz + line2_color.xyz, 0.0) + grain_amount)).rgb,
(line1_alpha * line2_alpha * mask_alpha * _HologramAlpha)) * color_glitch;
// 提前获取最终蒙版轴向
float mask_use_axis = i.mPos[(uint)_HologramMaskUseAxis];
// 处理最终颜色
fixed4 final_color;
final_color.a = hologram_color.a;
#if defined(_USE_DISSOLVE_EFFECT)
// 溶解相关
float height_allout = lerp(_ModelHeightButton, _ModelHeightTop, _DissolveThreshold - 2 * _DissolveFadeGap);
float height_progressOut = lerp(_ModelHeightButton, _ModelHeightTop, _DissolveThreshold - _DissolveFadeGap);
float height_progressMid = lerp(_ModelHeightButton, _ModelHeightTop, _DissolveThreshold);
float height_progressIn = lerp(_ModelHeightButton, _ModelHeightTop, _DissolveThreshold + _DissolveFadeGap);
// 设置完全消融 -> alphaTexture颜色过度
fixed dir = -2 * _ReverseDissolveDirection + 1;
fixed fadeAllOut = saturate(1000.0 * (dir * mask_use_axis - height_allout)); // * 1000的作用是优化掉sign,避免可能产生的编译分支问题
fixed3 fadeAllOutColor = lerp(_DissolveFadeOutColor.rgb, mask.rgb * _AlphaTexColor.rgb, fadeAllOut);
final_color.a = lerp(final_color.a, 1, fadeAllOut); // 处理透明度,但不要影响到全息的透明度
// 设置 溶解颜色->完全消融 的颜色过度
// sign 根据范围返回一个标志,分别是小于0时返回-1,大于0时返回1,否则返回0(不过这里被优化掉了)
fixed fadeOutEdge = saturate(1000.0 * (dir * mask_use_axis - height_progressOut));
fixed3 fadeOutEdgeColor = lerp(_DissolveFadeMidColor.rgb, fadeAllOutColor.rgb, fadeOutEdge);
// 设置 开始溶解->溶解颜色 的颜色过度
fixed fadeMidAmount = saturate(1000.0 * (dir * mask_use_axis - height_progressMid));
fixed3 fadeMidAmountColor = lerp(_DissolveFadeInColor.rgb, fadeOutEdgeColor.rgb, fadeMidAmount);
// 设置 源颜色->开始溶解 的颜色过度
fixed fadeInEdge = saturate(1000.0 * (dir * mask_use_axis - height_progressIn));
hologram_color.rgb = lerp(hologram_color.rgb, fadeMidAmountColor, fadeInEdge);
#endif
// 轴向淡出,不受任何上述效果的影响,直接裁剪掉alpha值
float mask_lerp_amount = mask_use_axis - _HologramYMask;
final_color.a = clamp(lerp(final_color.a, 0, mask_lerp_amount), 0.0, final_color.a);
// 预乘透明度
final_color.rgb = hologram_color.rgb * final_color.a;
return final_color;
}
#endif // MAINROLE_EFFECT_CG_INCLUDED