源战役客户端
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.

297 rader
9.7 KiB

1 månad sedan
  1. #if !defined (COMBINE_MODEL_EFFECT)
  2. #define COMBINE_MODEL_EFFECT
  3. #define WORLDPOS_AND_NORMAL_COORD(idx1, idx2) float4 worldPos : TEXCOORD##idx1; float3 normalDir : TEXCOORD##idx2;
  4. #define UVROLL_NOISE_MASK_COORD_LOW(idx) float4 uvroll_noise_mask_uv : TEXCOORD##idx;
  5. #define UVROLL_NOISE_COORD(idx) float4 uvroll_noise_uv : TEXCOORD##idx;
  6. #define UVROLL_MASK_COORD(idx) float4 uvroll_mask_uv : TEXCOORD##idx;
  7. #define SCAN_COORD(idx) float2 scan_uv : TEXCOORD##idx;
  8. #include "UnityCG.cginc"
  9. struct a2v
  10. {
  11. float4 vertex : POSITION;
  12. // 获取深度缓存颜色
  13. float4 color : COLOR;
  14. float2 texcoord : TEXCOORD0;
  15. fixed3 normal : NORMAL;
  16. };
  17. struct v2f_low
  18. {
  19. float4 vertex : POSITION;
  20. float4 color : COLOR0;
  21. float2 texcoord : TEXCOORD0;
  22. WORLDPOS_AND_NORMAL_COORD(1, 2)
  23. UVROLL_NOISE_MASK_COORD_LOW(3)
  24. SCAN_COORD(4)
  25. };
  26. struct v2f_normal
  27. {
  28. float4 vertex : POSITION;
  29. float4 color : COLOR0;
  30. float4 color2 : COLOR1;
  31. float2 texcoord : TEXCOORD0;
  32. WORLDPOS_AND_NORMAL_COORD(1, 2)
  33. UVROLL_NOISE_COORD(3)
  34. UVROLL_MASK_COORD(4)
  35. SCAN_COORD(5)
  36. };
  37. // uvroll
  38. sampler2D _UVRollTex, _UVRollTex2, _UVRollNoiseTex, _EffectMaskTex;
  39. float4 _UVRollTex_ST, _UVRollTex2_ST, _UVRollNoiseTex_ST, _EffectMaskTex_ST;
  40. fixed4 _UVRollColor1, _UVRollColor2;
  41. fixed _UVRollIntensity1, _UVRollIntensity2, _UVRollNoiseIntensity;
  42. fixed4 _UVRollSpeed, _UVRollNoiseSpeed, _UVRollMaskSpeed;
  43. // mb_fresnel
  44. uniform fixed4 _FresnelColor;
  45. uniform fixed _FresnelIntensity;
  46. // mb_outline
  47. uniform fixed4 _OutlineColor;
  48. uniform fixed _OutlineIntensity;
  49. //scan
  50. uniform float4 _ScanColor, _GridlineST;
  51. uniform sampler2D _ScanTex;
  52. uniform float4 _ScanTex_ST;
  53. uniform float _ScanSpeed, _ScanIntensity;
  54. // 获取uvrolladd_noise_mask效果
  55. // 第三档效果 一个UVroll和一个scan
  56. fixed4 GetUVRollAddLow(v2f_low i)
  57. {
  58. fixed4 noise = fixed4(0, 0, 0, 0);
  59. #if defined (_ROLLADD_NOISE_MASK_MAP)
  60. noise = tex2D(_UVRollNoiseTex, i.uvroll_noise_mask_uv.xy);
  61. #endif
  62. float2 trans_uv = i.texcoord + fixed2(_UVRollSpeed.x, _UVRollSpeed.y) * _Time.y;
  63. float2 uv = TRANSFORM_TEX(trans_uv, _UVRollTex);
  64. float4 result = fixed4(tex2D(_UVRollTex, uv.xy + fixed2(noise.r, noise.r) * _UVRollNoiseIntensity).rgb, 1) * i.color;
  65. result.a *= tex2D(_EffectMaskTex, i.uvroll_noise_mask_uv.zw).r;
  66. result.rgb *= _UVRollIntensity1;
  67. return fixed4(result.rgb * result.a, result.a);
  68. }
  69. // 第二档效果 两个UVRoll(同纹理)和两个Scan
  70. fixed4 GetUVRollAddMid(v2f_normal i)
  71. {
  72. fixed4 noise1 = fixed4(0, 0, 0, 0);
  73. fixed4 noise2 = fixed4(0, 0, 0, 0);
  74. #if defined (_ROLLADD_NOISE_MASK_MAP)
  75. noise1 = tex2D(_UVRollNoiseTex, i.uvroll_noise_uv.xy);
  76. noise2 = tex2D(_UVRollNoiseTex, i.uvroll_noise_uv.zw);
  77. #endif
  78. float4 uv;
  79. float2 trans_uv1 = i.texcoord + fixed2(_UVRollSpeed.x, _UVRollSpeed.y) * _Time.y;
  80. float2 trans_uv2 = i.texcoord + fixed2(_UVRollSpeed.z, _UVRollSpeed.w) * _Time.y;
  81. uv.xy = TRANSFORM_TEX(trans_uv1, _UVRollTex);
  82. uv.zw = TRANSFORM_TEX(trans_uv2, _UVRollTex);
  83. float4 result1 = fixed4(tex2D(_UVRollTex, uv.xy + fixed2(noise1.r, noise1.r) * _UVRollNoiseIntensity).rgb, 1) * i.color;
  84. float4 result2 = fixed4(tex2D(_UVRollTex, uv.zw + fixed2(noise2.r, noise2.r) * _UVRollNoiseIntensity).rgb, 1) * i.color2;
  85. result1.a *= tex2D(_EffectMaskTex, i.uvroll_mask_uv.xy).r;
  86. result2.a *= tex2D(_EffectMaskTex, i.uvroll_mask_uv.zw).g;
  87. result1.rgb *= _UVRollIntensity1;
  88. result2.rgb *= _UVRollIntensity2;
  89. return fixed4(result1.rgb * result1.a + result2.rgb * result2.a, result1.a + result2.a);
  90. }
  91. // 第一档效果 两个UVRoll(不同纹理)和两个Scan
  92. fixed4 GetUVRollAddFull(v2f_normal i)
  93. {
  94. fixed4 noise1 = fixed4(0, 0, 0, 0);
  95. fixed4 noise2 = fixed4(0, 0, 0, 0);
  96. #if defined (_ROLLADD_NOISE_MASK_MAP)
  97. noise1 = tex2D(_UVRollNoiseTex, i.uvroll_noise_uv.xy);
  98. noise2 = tex2D(_UVRollNoiseTex, i.uvroll_noise_uv.zw);
  99. #endif
  100. float4 uv;
  101. float2 trans_uv1 = i.texcoord + fixed2(_UVRollSpeed.x, _UVRollSpeed.y) * _Time.y;
  102. float2 trans_uv2 = i.texcoord + fixed2(_UVRollSpeed.z, _UVRollSpeed.w) * _Time.y;
  103. uv.xy = TRANSFORM_TEX(trans_uv1, _UVRollTex);
  104. uv.zw = TRANSFORM_TEX(trans_uv2, _UVRollTex2);
  105. float4 result1 = fixed4(tex2D(_UVRollTex, uv.xy + fixed2(noise1.r, noise1.r) * _UVRollNoiseIntensity).rgb, 1) * i.color;
  106. float4 result2 = fixed4(tex2D(_UVRollTex2, uv.zw + fixed2(noise2.r, noise2.r) * _UVRollNoiseIntensity).rgb, 1) * i.color2;
  107. result1.a *= tex2D(_EffectMaskTex, i.uvroll_mask_uv.xy).r;
  108. result2.a *= tex2D(_EffectMaskTex, i.uvroll_mask_uv.zw).g;
  109. result1.rgb *= _UVRollIntensity1;
  110. result2.rgb *= _UVRollIntensity2;
  111. return fixed4(result1.rgb * result1.a + result2.rgb * result2.a, result1.a + result2.a);
  112. }
  113. // 菲涅尔外发光
  114. fixed4 GetMbFresnel(float3 worldPos, float3 normal)
  115. {
  116. #if defined (_MB_FRESNEL)
  117. fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - worldPos);
  118. fixed tempDir = 1.0 - max(0, dot(normal, viewDir));
  119. fixed3 fresnel = (tempDir * tempDir * _FresnelColor.rgb * _FresnelColor.a) * _FresnelIntensity;
  120. return fixed4(fresnel, 1);
  121. #else
  122. return 0;
  123. #endif
  124. }
  125. // 受击外发光
  126. fixed4 GetMbOutline()
  127. {
  128. fixed3 finalColor = _OutlineColor.rgb * _OutlineIntensity * _OutlineColor.a;
  129. fixed a = _OutlineColor.a;
  130. return fixed4(finalColor, a);
  131. }
  132. // 扫描效果
  133. fixed4 GetScanColorLow(v2f_low i)
  134. {
  135. float speed = _Time.y * _ScanSpeed;
  136. float2 uv_speed = (speed).xx;
  137. float2 uv_Scan = i.texcoord + uv_speed;
  138. float2 uv_Mask = i.texcoord * _EffectMaskTex_ST.xy + _EffectMaskTex_ST.zw;
  139. float2 uv_Gridline = i.texcoord * _GridlineST.xy + _GridlineST.zw;
  140. // 根据UV获取目标纹理颜色,在后续拆分通道计算
  141. fixed4 scan_color = tex2D(_ScanTex, uv_Scan);
  142. fixed4 line_color = tex2D(_ScanTex, uv_Gridline);
  143. fixed4 mask_color = tex2D(_EffectMaskTex, uv_Mask);
  144. fixed4 result;
  145. result.rgb = (mask_color.b * _ScanIntensity * _ScanColor * scan_color.g * line_color.r).rgb;
  146. result.a = _ScanColor.a;
  147. return result;
  148. }
  149. fixed4 GetScanColorNormal(v2f_normal i)
  150. {
  151. float speed = _Time.y * _ScanSpeed;
  152. float2 uv_speed = (speed).xx;
  153. float2 uv_Scan = i.texcoord + uv_speed;
  154. float2 uv_Mask = i.texcoord * _EffectMaskTex_ST.xy + _EffectMaskTex_ST.zw;
  155. float2 uv_Gridline = i.texcoord * _GridlineST.xy + _GridlineST.zw;
  156. // 根据UV获取目标纹理颜色,在后续拆分通道计算
  157. fixed4 scan_color = tex2D(_ScanTex, uv_Scan);
  158. fixed4 line_color = tex2D(_ScanTex, uv_Gridline);
  159. fixed4 mask_color = tex2D(_EffectMaskTex, uv_Mask);
  160. fixed4 result1, result2;
  161. result1.rgb = (mask_color.b * _ScanIntensity * _ScanColor * scan_color.g * line_color.r).rgb;
  162. result1.a = _ScanColor.a;
  163. result2.rgb = (mask_color.a * _ScanIntensity * _ScanColor * scan_color.a * line_color.b).rgb;
  164. result2.a = _ScanColor.a;
  165. // result2 = 0;
  166. return result1 + result2;
  167. }
  168. // 顶点着色器处理
  169. v2f_low CmcVertLow(a2v v)
  170. {
  171. v2f_low o;
  172. o.vertex = UnityObjectToClipPos(v.vertex);
  173. o.color = v.color * _UVRollColor1;
  174. o.texcoord = v.texcoord;
  175. float2 uv;
  176. // uvroll noise uv
  177. #if defined (_ROLLADD_NOISE_MASK_MAP)
  178. uv = v.texcoord + float2(_UVRollNoiseSpeed.x, _UVRollNoiseSpeed.y) * _Time.y;
  179. o.uvroll_noise_mask_uv.xy = TRANSFORM_TEX(uv, _UVRollNoiseTex);
  180. #endif
  181. // effectmask uv
  182. uv = v.texcoord + float2(_UVRollMaskSpeed.x, _UVRollMaskSpeed.y) * _Time.y;
  183. o.uvroll_noise_mask_uv.zw = TRANSFORM_TEX(uv, _EffectMaskTex);
  184. o.normalDir = UnityObjectToWorldNormal(v.normal);
  185. o.worldPos = mul(unity_ObjectToWorld, v.vertex);
  186. return o;
  187. }
  188. v2f_normal CmcVertNormal(a2v v)
  189. {
  190. v2f_normal o;
  191. o.vertex = UnityObjectToClipPos(v.vertex);
  192. o.color = v.color * _UVRollColor1;
  193. o.color2 = v.color * _UVRollColor2;
  194. o.texcoord = v.texcoord;
  195. float2 uv;
  196. // uvroll noise uv
  197. #if defined (_ROLLADD_NOISE_MASK_MAP)
  198. uv = v.texcoord + float2(_UVRollNoiseSpeed.x, _UVRollNoiseSpeed.y) * _Time.y;
  199. o.uvroll_noise_uv.xy = TRANSFORM_TEX(uv, _UVRollNoiseTex);
  200. uv = v.texcoord + float2(_UVRollNoiseSpeed.z, _UVRollNoiseSpeed.w) * _Time.y;
  201. o.uvroll_noise_uv.zw = TRANSFORM_TEX(uv, _UVRollNoiseTex);
  202. #endif
  203. // effectmask uv
  204. uv = v.texcoord + float2(_UVRollMaskSpeed.x, _UVRollMaskSpeed.y) * _Time.y;
  205. o.uvroll_mask_uv.xy = TRANSFORM_TEX(uv, _EffectMaskTex);
  206. uv = v.texcoord + float2(_UVRollMaskSpeed.z, _UVRollMaskSpeed.w) * _Time.y;
  207. o.uvroll_mask_uv.zw = TRANSFORM_TEX(uv, _EffectMaskTex);
  208. o.normalDir = UnityObjectToWorldNormal(v.normal);
  209. o.worldPos = mul(unity_ObjectToWorld, v.vertex);
  210. return o;
  211. }
  212. // 片元着色器
  213. fixed4 CmcFragLow(v2f_low i) : SV_Target
  214. {
  215. // 颜色融合
  216. fixed4 final_color = GetUVRollAddLow(i);
  217. fixed4 fresnel_color = GetMbFresnel(i.worldPos, i.normalDir);
  218. final_color = final_color * final_color.a + fresnel_color;
  219. final_color += GetMbOutline();
  220. final_color += GetScanColorLow(i);
  221. return final_color;
  222. }
  223. fixed4 CmcFragMid(v2f_normal i) : SV_Target
  224. {
  225. // 颜色融合
  226. fixed4 final_color = GetUVRollAddMid(i);
  227. fixed4 fresnel_color = GetMbFresnel(i.worldPos, i.normalDir);
  228. final_color = final_color * final_color.a + fresnel_color;
  229. final_color += GetMbOutline();
  230. final_color += GetScanColorNormal(i);
  231. return final_color;
  232. }
  233. fixed4 CmcFragFull(v2f_normal i) : SV_Target
  234. {
  235. // 颜色融合
  236. fixed4 final_color = GetUVRollAddFull(i);
  237. fixed4 fresnel_color = GetMbFresnel(i.worldPos, i.normalDir);
  238. final_color = final_color * final_color.a + fresnel_color;
  239. final_color += GetMbOutline();
  240. final_color += GetScanColorNormal(i);
  241. return final_color;
  242. }
  243. #endif