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