|
#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
|