源战役客户端
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 
 

298 rader
9.7 KiB

#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