#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