#if !defined (COMBINE_MODEL_EFFECT)
|
|
#define COMBINE_MODEL_EFFECT
|
|
|
|
#define WORLDPOS_AND_NORMAL_COORD(idx1, idx2) float4 worldPos : TEXCOORD##idx1; float3 normalDir : TEXCOORD##idx2;
|
|
|
|
#define UVROLL_NOISE_MASK_COORD_LOW(idx) float4 uvroll_noise_mask_uv : TEXCOORD##idx;
|
|
|
|
#define UVROLL_NOISE_COORD(idx) float4 uvroll_noise_uv : TEXCOORD##idx;
|
|
#define UVROLL_MASK_COORD(idx) float4 uvroll_mask_uv : TEXCOORD##idx;
|
|
|
|
#define SCAN_COORD(idx) float2 scan_uv : TEXCOORD##idx;
|
|
|
|
#include "UnityCG.cginc"
|
|
|
|
struct a2v
|
|
{
|
|
float4 vertex : POSITION;
|
|
// 获取深度缓存颜色
|
|
float4 color : COLOR;
|
|
float2 texcoord : TEXCOORD0;
|
|
fixed3 normal : NORMAL;
|
|
};
|
|
|
|
struct v2f_low
|
|
{
|
|
float4 vertex : POSITION;
|
|
float4 color : COLOR0;
|
|
float2 texcoord : TEXCOORD0;
|
|
WORLDPOS_AND_NORMAL_COORD(1, 2)
|
|
UVROLL_NOISE_MASK_COORD_LOW(3)
|
|
SCAN_COORD(4)
|
|
};
|
|
|
|
struct v2f_normal
|
|
{
|
|
float4 vertex : POSITION;
|
|
float4 color : COLOR0;
|
|
float4 color2 : COLOR1;
|
|
float2 texcoord : TEXCOORD0;
|
|
WORLDPOS_AND_NORMAL_COORD(1, 2)
|
|
UVROLL_NOISE_COORD(3)
|
|
UVROLL_MASK_COORD(4)
|
|
SCAN_COORD(5)
|
|
};
|
|
|
|
// uvroll
|
|
sampler2D _UVRollTex, _UVRollTex2, _UVRollNoiseTex, _EffectMaskTex;
|
|
float4 _UVRollTex_ST, _UVRollTex2_ST, _UVRollNoiseTex_ST, _EffectMaskTex_ST;
|
|
fixed4 _UVRollColor1, _UVRollColor2;
|
|
fixed _UVRollIntensity1, _UVRollIntensity2, _UVRollNoiseIntensity;
|
|
fixed4 _UVRollSpeed, _UVRollNoiseSpeed, _UVRollMaskSpeed;
|
|
|
|
// mb_fresnel
|
|
uniform fixed4 _FresnelColor;
|
|
uniform fixed _FresnelIntensity;
|
|
|
|
// mb_outline
|
|
uniform fixed4 _OutlineColor;
|
|
uniform fixed _OutlineIntensity;
|
|
|
|
//scan
|
|
uniform float4 _ScanColor, _GridlineST;
|
|
uniform sampler2D _ScanTex;
|
|
uniform float4 _ScanTex_ST;
|
|
uniform float _ScanSpeed, _ScanIntensity;
|
|
|
|
// 获取uvrolladd_noise_mask效果
|
|
// 第三档效果 一个UVroll和一个scan
|
|
fixed4 GetUVRollAddLow(v2f_low i)
|
|
{
|
|
fixed4 noise = fixed4(0, 0, 0, 0);
|
|
|
|
#if defined (_ROLLADD_NOISE_MASK_MAP)
|
|
noise = tex2D(_UVRollNoiseTex, i.uvroll_noise_mask_uv.xy);
|
|
#endif
|
|
|
|
float2 trans_uv = i.texcoord + fixed2(_UVRollSpeed.x, _UVRollSpeed.y) * _Time.y;
|
|
float2 uv = TRANSFORM_TEX(trans_uv, _UVRollTex);
|
|
|
|
float4 result = fixed4(tex2D(_UVRollTex, uv.xy + fixed2(noise.r, noise.r) * _UVRollNoiseIntensity).rgb, 1) * i.color;
|
|
|
|
result.a *= tex2D(_EffectMaskTex, i.uvroll_noise_mask_uv.zw).r;
|
|
|
|
result.rgb *= _UVRollIntensity1;
|
|
return fixed4(result.rgb * result.a, result.a);
|
|
}
|
|
|
|
// 第二档效果 两个UVRoll(同纹理)和两个Scan
|
|
fixed4 GetUVRollAddMid(v2f_normal i)
|
|
{
|
|
fixed4 noise1 = fixed4(0, 0, 0, 0);
|
|
fixed4 noise2 = fixed4(0, 0, 0, 0);
|
|
|
|
#if defined (_ROLLADD_NOISE_MASK_MAP)
|
|
noise1 = tex2D(_UVRollNoiseTex, i.uvroll_noise_uv.xy);
|
|
noise2 = tex2D(_UVRollNoiseTex, i.uvroll_noise_uv.zw);
|
|
#endif
|
|
|
|
float4 uv;
|
|
float2 trans_uv1 = i.texcoord + fixed2(_UVRollSpeed.x, _UVRollSpeed.y) * _Time.y;
|
|
float2 trans_uv2 = i.texcoord + fixed2(_UVRollSpeed.z, _UVRollSpeed.w) * _Time.y;
|
|
|
|
uv.xy = TRANSFORM_TEX(trans_uv1, _UVRollTex);
|
|
uv.zw = TRANSFORM_TEX(trans_uv2, _UVRollTex);
|
|
|
|
float4 result1 = fixed4(tex2D(_UVRollTex, uv.xy + fixed2(noise1.r, noise1.r) * _UVRollNoiseIntensity).rgb, 1) * i.color;
|
|
float4 result2 = fixed4(tex2D(_UVRollTex, uv.zw + fixed2(noise2.r, noise2.r) * _UVRollNoiseIntensity).rgb, 1) * i.color2;
|
|
|
|
result1.a *= tex2D(_EffectMaskTex, i.uvroll_mask_uv.xy).r;
|
|
result2.a *= tex2D(_EffectMaskTex, i.uvroll_mask_uv.zw).g;
|
|
|
|
result1.rgb *= _UVRollIntensity1;
|
|
result2.rgb *= _UVRollIntensity2;
|
|
return fixed4(result1.rgb * result1.a + result2.rgb * result2.a, result1.a + result2.a);
|
|
}
|
|
|
|
// 第一档效果 两个UVRoll(不同纹理)和两个Scan
|
|
fixed4 GetUVRollAddFull(v2f_normal i)
|
|
{
|
|
fixed4 noise1 = fixed4(0, 0, 0, 0);
|
|
fixed4 noise2 = fixed4(0, 0, 0, 0);
|
|
|
|
#if defined (_ROLLADD_NOISE_MASK_MAP)
|
|
noise1 = tex2D(_UVRollNoiseTex, i.uvroll_noise_uv.xy);
|
|
noise2 = tex2D(_UVRollNoiseTex, i.uvroll_noise_uv.zw);
|
|
#endif
|
|
|
|
float4 uv;
|
|
float2 trans_uv1 = i.texcoord + fixed2(_UVRollSpeed.x, _UVRollSpeed.y) * _Time.y;
|
|
float2 trans_uv2 = i.texcoord + fixed2(_UVRollSpeed.z, _UVRollSpeed.w) * _Time.y;
|
|
|
|
uv.xy = TRANSFORM_TEX(trans_uv1, _UVRollTex);
|
|
uv.zw = TRANSFORM_TEX(trans_uv2, _UVRollTex2);
|
|
|
|
float4 result1 = fixed4(tex2D(_UVRollTex, uv.xy + fixed2(noise1.r, noise1.r) * _UVRollNoiseIntensity).rgb, 1) * i.color;
|
|
float4 result2 = fixed4(tex2D(_UVRollTex2, uv.zw + fixed2(noise2.r, noise2.r) * _UVRollNoiseIntensity).rgb, 1) * i.color2;
|
|
|
|
result1.a *= tex2D(_EffectMaskTex, i.uvroll_mask_uv.xy).r;
|
|
result2.a *= tex2D(_EffectMaskTex, i.uvroll_mask_uv.zw).g;
|
|
|
|
result1.rgb *= _UVRollIntensity1;
|
|
result2.rgb *= _UVRollIntensity2;
|
|
return fixed4(result1.rgb * result1.a + result2.rgb * result2.a, result1.a + result2.a);
|
|
}
|
|
|
|
// 菲涅尔外发光
|
|
fixed4 GetMbFresnel(float3 worldPos, float3 normal)
|
|
{
|
|
#if defined (_MB_FRESNEL)
|
|
fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - worldPos);
|
|
fixed tempDir = 1.0 - max(0, dot(normal, viewDir));
|
|
fixed3 fresnel = (tempDir * tempDir * _FresnelColor.rgb * _FresnelColor.a) * _FresnelIntensity;
|
|
return fixed4(fresnel, 1);
|
|
#else
|
|
return 0;
|
|
#endif
|
|
}
|
|
|
|
// 受击外发光
|
|
fixed4 GetMbOutline()
|
|
{
|
|
fixed3 finalColor = _OutlineColor.rgb * _OutlineIntensity * _OutlineColor.a;
|
|
fixed a = _OutlineColor.a;
|
|
return fixed4(finalColor, a);
|
|
}
|
|
|
|
// 扫描效果
|
|
fixed4 GetScanColorLow(v2f_low i)
|
|
{
|
|
float speed = _Time.y * _ScanSpeed;
|
|
float2 uv_speed = (speed).xx;
|
|
float2 uv_Scan = i.texcoord + uv_speed;
|
|
|
|
float2 uv_Mask = i.texcoord * _EffectMaskTex_ST.xy + _EffectMaskTex_ST.zw;
|
|
float2 uv_Gridline = i.texcoord * _GridlineST.xy + _GridlineST.zw;
|
|
// 根据UV获取目标纹理颜色,在后续拆分通道计算
|
|
fixed4 scan_color = tex2D(_ScanTex, uv_Scan);
|
|
fixed4 line_color = tex2D(_ScanTex, uv_Gridline);
|
|
fixed4 mask_color = tex2D(_EffectMaskTex, uv_Mask);
|
|
fixed4 result;
|
|
result.rgb = (mask_color.b * _ScanIntensity * _ScanColor * scan_color.g * line_color.r).rgb;
|
|
result.a = _ScanColor.a;
|
|
return result;
|
|
}
|
|
|
|
fixed4 GetScanColorNormal(v2f_normal i)
|
|
{
|
|
float speed = _Time.y * _ScanSpeed;
|
|
float2 uv_speed = (speed).xx;
|
|
float2 uv_Scan = i.texcoord + uv_speed;
|
|
|
|
float2 uv_Mask = i.texcoord * _EffectMaskTex_ST.xy + _EffectMaskTex_ST.zw;
|
|
float2 uv_Gridline = i.texcoord * _GridlineST.xy + _GridlineST.zw;
|
|
// 根据UV获取目标纹理颜色,在后续拆分通道计算
|
|
fixed4 scan_color = tex2D(_ScanTex, uv_Scan);
|
|
fixed4 line_color = tex2D(_ScanTex, uv_Gridline);
|
|
fixed4 mask_color = tex2D(_EffectMaskTex, uv_Mask);
|
|
fixed4 result1, result2;
|
|
result1.rgb = (mask_color.b * _ScanIntensity * _ScanColor * scan_color.g * line_color.r).rgb;
|
|
result1.a = _ScanColor.a;
|
|
result2.rgb = (mask_color.a * _ScanIntensity * _ScanColor * scan_color.a * line_color.b).rgb;
|
|
result2.a = _ScanColor.a;
|
|
// result2 = 0;
|
|
return result1 + result2;
|
|
}
|
|
|
|
// 顶点着色器处理
|
|
v2f_low CmcVertLow(a2v v)
|
|
{
|
|
v2f_low o;
|
|
o.vertex = UnityObjectToClipPos(v.vertex);
|
|
o.color = v.color * _UVRollColor1;
|
|
o.texcoord = v.texcoord;
|
|
float2 uv;
|
|
// uvroll noise uv
|
|
#if defined (_ROLLADD_NOISE_MASK_MAP)
|
|
uv = v.texcoord + float2(_UVRollNoiseSpeed.x, _UVRollNoiseSpeed.y) * _Time.y;
|
|
o.uvroll_noise_mask_uv.xy = TRANSFORM_TEX(uv, _UVRollNoiseTex);
|
|
#endif
|
|
// effectmask uv
|
|
uv = v.texcoord + float2(_UVRollMaskSpeed.x, _UVRollMaskSpeed.y) * _Time.y;
|
|
o.uvroll_noise_mask_uv.zw = TRANSFORM_TEX(uv, _EffectMaskTex);
|
|
|
|
o.normalDir = UnityObjectToWorldNormal(v.normal);
|
|
o.worldPos = mul(unity_ObjectToWorld, v.vertex);
|
|
return o;
|
|
}
|
|
|
|
v2f_normal CmcVertNormal(a2v v)
|
|
{
|
|
v2f_normal o;
|
|
o.vertex = UnityObjectToClipPos(v.vertex);
|
|
o.color = v.color * _UVRollColor1;
|
|
o.color2 = v.color * _UVRollColor2;
|
|
o.texcoord = v.texcoord;
|
|
float2 uv;
|
|
// uvroll noise uv
|
|
#if defined (_ROLLADD_NOISE_MASK_MAP)
|
|
uv = v.texcoord + float2(_UVRollNoiseSpeed.x, _UVRollNoiseSpeed.y) * _Time.y;
|
|
o.uvroll_noise_uv.xy = TRANSFORM_TEX(uv, _UVRollNoiseTex);
|
|
uv = v.texcoord + float2(_UVRollNoiseSpeed.z, _UVRollNoiseSpeed.w) * _Time.y;
|
|
o.uvroll_noise_uv.zw = TRANSFORM_TEX(uv, _UVRollNoiseTex);
|
|
#endif
|
|
// effectmask uv
|
|
uv = v.texcoord + float2(_UVRollMaskSpeed.x, _UVRollMaskSpeed.y) * _Time.y;
|
|
o.uvroll_mask_uv.xy = TRANSFORM_TEX(uv, _EffectMaskTex);
|
|
uv = v.texcoord + float2(_UVRollMaskSpeed.z, _UVRollMaskSpeed.w) * _Time.y;
|
|
o.uvroll_mask_uv.zw = TRANSFORM_TEX(uv, _EffectMaskTex);
|
|
|
|
o.normalDir = UnityObjectToWorldNormal(v.normal);
|
|
o.worldPos = mul(unity_ObjectToWorld, v.vertex);
|
|
return o;
|
|
}
|
|
|
|
// 片元着色器
|
|
fixed4 CmcFragLow(v2f_low i) : SV_Target
|
|
{
|
|
// 颜色融合
|
|
fixed4 final_color = GetUVRollAddLow(i);
|
|
|
|
fixed4 fresnel_color = GetMbFresnel(i.worldPos, i.normalDir);
|
|
final_color = final_color * final_color.a + fresnel_color;
|
|
|
|
final_color += GetMbOutline();
|
|
|
|
final_color += GetScanColorLow(i);
|
|
return final_color;
|
|
}
|
|
|
|
fixed4 CmcFragMid(v2f_normal i) : SV_Target
|
|
{
|
|
// 颜色融合
|
|
fixed4 final_color = GetUVRollAddMid(i);
|
|
|
|
fixed4 fresnel_color = GetMbFresnel(i.worldPos, i.normalDir);
|
|
final_color = final_color * final_color.a + fresnel_color;
|
|
|
|
final_color += GetMbOutline();
|
|
|
|
final_color += GetScanColorNormal(i);
|
|
return final_color;
|
|
}
|
|
|
|
fixed4 CmcFragFull(v2f_normal i) : SV_Target
|
|
{
|
|
// 颜色融合
|
|
fixed4 final_color = GetUVRollAddFull(i);
|
|
|
|
fixed4 fresnel_color = GetMbFresnel(i.worldPos, i.normalDir);
|
|
final_color = final_color * final_color.a + fresnel_color;
|
|
|
|
final_color += GetMbOutline();
|
|
|
|
final_color += GetScanColorNormal(i);
|
|
return final_color;
|
|
}
|
|
|
|
#endif
|