#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