源战役客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

505 lines
23 KiB

пре 1 месец
  1. #ifndef MAINROLE_EFFECT_CG_INCLUDED
  2. #define MAINROLE_EFFECT_CG_INCLUDED
  3. #include "UnityCG.cginc"
  4. struct a2v
  5. {
  6. float4 vertex : POSITION;
  7. float2 uv : TEXCOORD0;
  8. float3 normal:NORMAL;
  9. float4 tangent : TANGENT;
  10. };
  11. struct a2v_hg
  12. {
  13. float4 vertex : POSITION;
  14. float2 uv : TEXCOORD0;
  15. float3 normal:NORMAL;
  16. float4 tangent : TANGENT;
  17. };
  18. struct v2f
  19. {
  20. float4 pos : SV_POSITION;
  21. float2 uv : TEXCOORD0;
  22. float4 posWorld : TEXCOORD1;
  23. float3 normalDir : TEXCOORD2;
  24. float3 dir_rimlight : TEXCOORD3;
  25. float3 dir_shadow : TEXCOORD4;
  26. };
  27. struct v2f_hg
  28. {
  29. float4 pos : SV_POSITION;
  30. float2 uv : TEXCOORD0;
  31. float4 posWorld : TEXCOORD1;
  32. float3 normalDir : TEXCOORD2;
  33. float4 mPos : TEXCOORD3;
  34. };
  35. fixed4 _Color;
  36. float4 _ShadowDir, _RimDir;
  37. // 通用顶点函数,主要内容为转化顶点坐标和发现坐标,以及归一化边缘方向和法线方向
  38. v2f MainRoleVertexDefault(a2v v)
  39. {
  40. v2f o;
  41. o.posWorld = mul(unity_ObjectToWorld, v.vertex);
  42. o.pos = mul(UNITY_MATRIX_VP, o.posWorld);
  43. o.uv = v.uv;
  44. o.normalDir = mul((float3x3)unity_ObjectToWorld, v.normal);
  45. o.dir_rimlight = normalize(_RimDir.xyz);
  46. o.dir_shadow = normalize(_ShadowDir.xyz);
  47. return o;
  48. }
  49. float4 _HologramGliterData1, _HologramGliterData2;
  50. float3 VertexHologramOffset(float3 vertex, half4 offsetData)
  51. {
  52. float speed = offsetData.x;
  53. float range = offsetData.y;
  54. float offset = offsetData.z;
  55. float frequency = offsetData.w;
  56. float offset_time = sin(_Time.y * speed);
  57. // step(y, x) 如果 x >= y 则返回1,否则返回0
  58. float timeToGliter = step(frequency, offset_time);
  59. float gliterPosY = sin(vertex.x + _Time.z);
  60. float gliterPosYRange = step(0, gliterPosY) * step(gliterPosY, range);
  61. // 获取偏移量
  62. float res = gliterPosYRange * offset * timeToGliter * gliterPosY;
  63. // 将这个偏移量定义为视角坐标的偏移量,再转到模型坐标
  64. float3 view_offset = float3(res, 0, 0);
  65. return mul((float3x3)UNITY_MATRIX_T_MV, view_offset);
  66. }
  67. v2f_hg MainRoleHologramMaskVertex(a2v_hg v)
  68. {
  69. v2f_hg o;
  70. // 产生模型顶点方向上的扭曲系数
  71. v.vertex.xyz += VertexHologramOffset(v.vertex.xyz, _HologramGliterData1);
  72. v.vertex.xyz += VertexHologramOffset(v.vertex.xyz, _HologramGliterData2);
  73. o.posWorld = mul(unity_ObjectToWorld, v.vertex);
  74. o.pos = mul(UNITY_MATRIX_VP, o.posWorld);
  75. o.uv = v.uv;
  76. o.normalDir = mul((float3x3)unity_ObjectToWorld, v.normal);
  77. return o;
  78. }
  79. // 全息专用顶点函数,相比于通用顶点函数多了顶点偏移的逻辑
  80. v2f_hg MainRoleHologramVertex(a2v_hg v)
  81. {
  82. v2f_hg o;
  83. // 产生模型顶点方向上的扭曲系数
  84. v.vertex.xyz += VertexHologramOffset(v.vertex.xyz, _HologramGliterData1);
  85. v.vertex.xyz += VertexHologramOffset(v.vertex.xyz, _HologramGliterData2);
  86. o.mPos = v.vertex;
  87. o.posWorld = mul(unity_ObjectToWorld, v.vertex);
  88. o.pos = mul(UNITY_MATRIX_VP, o.posWorld);
  89. o.uv = v.uv;
  90. o.normalDir = mul((float3x3)unity_ObjectToWorld, v.normal);
  91. return o;
  92. }
  93. // MainRole参数
  94. sampler2D _MainTex, _Mask, _MatcapTex;
  95. float4 _AmbientColor, _SunColor, _BrightShadow, _DarkShadow, _RimColor;
  96. float _Shadownol1, _Shadownol2, _MatcapScale1, _MatcapScale2;
  97. // 溶解效果参数
  98. sampler2D _DissolveMap;
  99. float4 _DissolveMap_ST;
  100. fixed4 _DissolveFadeInColor, _DissolveFadeMidColor, _DissolveFadeOutColor;
  101. fixed _DissolveThreshold, _DissolveFadeInThreshold, _DissolveFadeMidThreshold, _DissolveFadeOutThreshold;
  102. // 全息效果
  103. sampler2D _HologramGlitchMap;
  104. fixed4 _HologramColor;
  105. half _HologramAlpha;
  106. half _HologramColorGlitchTog, _HologramColorGlitch, _HologramColorGlitchMin;
  107. half4 _HologramColorGlitchData;
  108. // 全息菲涅尔
  109. half _FresnelScale, _FresnelPower, _FresnelAlphaScale, _FresnelAlphaPower;
  110. // 全息扫描线
  111. sampler2D _HologramLine1;
  112. half _HologramLine1Speed, _HologramLine1Frequency, _HologramLine1Alpha;
  113. sampler2D _HologramLine2;
  114. half _HologramLine2Speed, _HologramLine2Frequency, _HologramLine2Alpha;
  115. // 全息颜色颗粒
  116. half4 _HologramGrainData;
  117. half _HologramGrainSpeed, _HologramGrainAffect;
  118. // 全息蒙版
  119. sampler2D _HologramMaskMap;
  120. half _HologramMaskAffect, _HologramMaskUseAxis, _HologramYMask;
  121. float4 _HologramMaskMap_ST;
  122. // 全息+溶解参数
  123. fixed4 _AlphaTexColor;
  124. float _ModelHeightButton, _ModelHeightTop, _DissolveFadeGap;
  125. fixed _ReverseDissolveDirection;
  126. float4 MainRoleOpaqueFragment(v2f i) : SV_Target
  127. {
  128. float3 mainColor = tex2D(_MainTex, i.uv).rgb;
  129. #if defined(_USE_DISSOLVE_EFFECT)
  130. // 不满足阈值的片元直接舍弃
  131. #if defined (_USE_DISSOLVE_MAP)
  132. float2 dissolve_uv = TRANSFORM_TEX(i.uv, _DissolveMap);
  133. fixed4 dissolveValue = tex2D(_DissolveMap, dissolve_uv);
  134. if (dissolveValue.r < _DissolveThreshold)
  135. #else
  136. if (mainColor.r < _DissolveThreshold)
  137. #endif
  138. {
  139. discard;
  140. }
  141. #endif
  142. float3 diffuse_fac = _SunColor + _AmbientColor.xyz;
  143. float3 diffuse = mainColor * 0.5 * 1.2784 * diffuse_fac;
  144. float3 N = normalize(i.normalDir);
  145. float3 L = i.dir_shadow.xyz;
  146. float4 resultColor;
  147. float3 V = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);
  148. float NdotView = clamp(dot(N, V), 0.0, 1.0);
  149. float NdotshadowFactor = clamp(dot(L, N), 0.0, 1.0);
  150. float RimlightDotValue = clamp(dot(i.dir_rimlight, N), 0.0, 1.0);
  151. float Ndotshadow = smoothstep(_Shadownol1, _Shadownol2, NdotshadowFactor);
  152. float dif_illum = dot(diffuse, float3(0.299, 0.587, 0.114));
  153. float shadowshift = smoothstep(0.25, 0.74, dif_illum);
  154. float3 shadowColor = lerp(_DarkShadow.rgb, _BrightShadow.rgb, shadowshift);
  155. float3 baseColor = lerp(shadowColor * diffuse.rgb, diffuse.rgb, Ndotshadow);
  156. float rimdot = clamp(RimlightDotValue * (1.0 - NdotView), 0.0, 1.0);
  157. float rimffcal = smoothstep(0.35, 0.58, rimdot);
  158. float3 rim = rimffcal * diffuse * _RimColor.rgb;
  159. resultColor.rgb = baseColor + rim;
  160. float3 maskTemp = tex2D(_Mask, i.uv).rgb;
  161. float2 matcapuv = mul((float3x3)UNITY_MATRIX_V, N).xy;
  162. matcapuv.y = -matcapuv.y;
  163. matcapuv = matcapuv * 0.5 + 0.5;
  164. float3 matColor1 = tex2D(_MatcapTex, float2(matcapuv.x * 0.5, matcapuv.y)).rgb;
  165. float3 matColor2 = tex2D(_MatcapTex, float2(matcapuv.x * 0.5 + 0.5, matcapuv.y)).rgb;
  166. float matColor = (matColor1 * maskTemp.x * _MatcapScale1 + matColor2 * maskTemp.y * _MatcapScale2);
  167. resultColor.rgb += (matColor * diffuse + maskTemp.z * diffuse);
  168. resultColor.a = 1;
  169. resultColor *= _Color;
  170. #if defined(_USE_DISSOLVE_EFFECT)
  171. // 溶解相关
  172. // percentage 讲道理不会大于1的,大于1的情况上面就被迪斯咯的了,但pectange的整体趋势是随着_DissolveThreshold增加而增加这个是肯定的
  173. #if defined (_USE_DISSOLVE_MAP)
  174. fixed percentage = _DissolveThreshold / max(dissolveValue.r, 0.0001);
  175. #else
  176. fixed percentage = _DissolveThreshold / max(mainColor.r, 0.0001);
  177. #endif
  178. // 设置 溶解颜色->完全消融 的颜色过度
  179. // sign 根据范围返回一个标志,分别是小于0时返回-1,大于0时返回1,否则返回0(不过这里被优化掉了)
  180. fixed fadeOutEdge = saturate(1000.0 * (percentage - _DissolveFadeOutThreshold));
  181. fixed3 fadeOutEdgeColor = lerp(_DissolveFadeMidColor.rgb, _DissolveFadeOutColor.rgb, fadeOutEdge);
  182. // 设置 开始溶解->溶解颜色 的颜色过度
  183. fixed fadeMidAmount = saturate(1000.0 * (percentage - _DissolveFadeMidThreshold));
  184. fixed3 fadeMidAmountColor = lerp(_DissolveFadeInColor.rgb, fadeOutEdgeColor.rgb, fadeMidAmount);
  185. // 设置 源颜色->开始溶解 的颜色过度
  186. fixed fadeInEdge = saturate(1000.0 * (percentage - _DissolveFadeInThreshold));
  187. resultColor.rgb = lerp(resultColor.rgb, fadeMidAmountColor, fadeInEdge);
  188. #endif
  189. return resultColor;
  190. }
  191. float4 MainRoleTransparentFragment(v2f i) : SV_Target
  192. {
  193. float4 mainColor = tex2D(_MainTex, i.uv);
  194. #if defined(_USE_DISSOLVE_EFFECT)
  195. // 不满足阈值的片元直接舍弃
  196. #if defined (_USE_DISSOLVE_MAP)
  197. float2 dissolve_uv = TRANSFORM_TEX(i.uv, _DissolveMap);
  198. fixed4 dissolveValue = tex2D(_DissolveMap, dissolve_uv);
  199. if (dissolveValue.r < _DissolveThreshold)
  200. #else
  201. if (mainColor.r < _DissolveThreshold)
  202. #endif
  203. {
  204. discard;
  205. }
  206. #endif
  207. float3 diffuse_fac = _SunColor + _AmbientColor.xyz;
  208. float3 diffuse = mainColor.rgb * 0.5 * 1.2784 * diffuse_fac;
  209. float3 N = normalize(i.normalDir);
  210. float3 L = i.dir_shadow.xyz;
  211. float4 resultColor;
  212. float3 V = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);
  213. float NdotView = clamp(dot(N, V), 0.0, 1.0);
  214. float NdotshadowFactor = clamp(dot(L, N), 0.0, 1.0);
  215. float RimlightDotValue = clamp(dot(i.dir_rimlight, N), 0.0, 1.0);
  216. float Ndotshadow = smoothstep(_Shadownol1, _Shadownol2, NdotshadowFactor);
  217. float dif_illum = dot(diffuse, float3(0.299, 0.587, 0.114));
  218. float shadowshift = smoothstep(0.25, 0.74, dif_illum);
  219. float3 shadowColor = lerp(_DarkShadow.rgb, _BrightShadow.rgb, shadowshift);
  220. float3 baseColor = lerp(shadowColor * diffuse.rgb, diffuse.rgb, Ndotshadow);
  221. float rimdot = clamp(RimlightDotValue * (1.0 - NdotView), 0.0, 1.0);
  222. float rimffcal = smoothstep(0.35, 0.58, rimdot);
  223. float3 rim = rimffcal * diffuse * _RimColor.rgb;
  224. resultColor.rgb = baseColor + rim;
  225. float3 maskTemp = tex2D(_Mask, i.uv).rgb;
  226. float2 matcapuv = mul((float3x3)UNITY_MATRIX_V, N).xy;
  227. matcapuv.y = -matcapuv.y;
  228. matcapuv = matcapuv * 0.5 + 0.5;
  229. float3 matColor1 = tex2D(_MatcapTex, float2(matcapuv.x * 0.5, matcapuv.y)).rgb;
  230. float3 matColor2 = tex2D(_MatcapTex, float2(matcapuv.x * 0.5 + 0.5, matcapuv.y)).rgb;
  231. float matColor = (matColor1 * maskTemp.x * _MatcapScale1 + matColor2 * maskTemp.y * _MatcapScale2);
  232. resultColor.rgb += (matColor * diffuse + maskTemp.z * diffuse);
  233. resultColor.a = mainColor.a;
  234. resultColor *= _Color;
  235. #if defined(_USE_DISSOLVE_EFFECT)
  236. // 溶解相关
  237. // percentage 讲道理不会大于1的,大于1的情况上面就被迪斯咯的了,但pectange的整体趋势是随着_DissolveThreshold增加而增加这个是肯定的
  238. #if defined (_USE_DISSOLVE_MAP)
  239. fixed percentage = _DissolveThreshold / max(dissolveValue.r, 0.0001);
  240. #else
  241. fixed percentage = _DissolveThreshold / max(mainColor.r, 0.0001);
  242. #endif
  243. // 设置 溶解颜色->完全消融 的颜色过度
  244. // sign 根据范围返回一个标志,分别是小于0时返回-1,大于0时返回1,否则返回0(不过这里被优化掉了)
  245. fixed fadeOutEdge = saturate(1000.0 * (percentage - _DissolveFadeOutThreshold));
  246. fixed3 fadeOutEdgeColor = lerp(_DissolveFadeMidColor.rgb, _DissolveFadeOutColor.rgb, fadeOutEdge);
  247. // 设置 开始溶解->溶解颜色 的颜色过度
  248. fixed fadeMidAmount = saturate(1000.0 * (percentage - _DissolveFadeMidThreshold));
  249. fixed3 fadeMidAmountColor = lerp(_DissolveFadeInColor.rgb, fadeOutEdgeColor.rgb, fadeMidAmount);
  250. // 设置 源颜色->开始溶解 的颜色过度
  251. fixed fadeInEdge = saturate(1000.0 * (percentage - _DissolveFadeInThreshold));
  252. resultColor.rgb = lerp(resultColor.rgb, fadeMidAmountColor, fadeInEdge);
  253. #endif
  254. return resultColor;
  255. }
  256. float SampleNoiseMap(float2 uv)
  257. {
  258. return tex2D(_HologramGlitchMap, uv).r;
  259. }
  260. float4 MainRoleHologramMaskFragment(v2f_hg i) : SV_Target
  261. {
  262. return 1;
  263. }
  264. float4 MainRoleHologramFragment(v2f_hg i) : SV_Target
  265. {
  266. float4 main_color = _HologramColor;
  267. // 用主纹理的r通道做颜色蒙版
  268. float2 mask_uv = i.uv.xy * _HologramMaskMap_ST.xy + _HologramMaskMap_ST.zw;
  269. float4 mask = tex2D(_HologramMaskMap, mask_uv);
  270. float mask_alpha = lerp(1, mask.b, _HologramMaskAffect);
  271. #if defined(_USE_DISSOLVE_EFFECT)
  272. // 不满足阈值的片元直接舍弃
  273. #if defined (_USE_DISSOLVE_MAP)
  274. float2 dissolve_uv = TRANSFORM_TEX(i.uv, _DissolveMap);
  275. fixed4 dissolveValue = tex2D(_DissolveMap, dissolve_uv);
  276. if (dissolveValue.r < _DissolveThreshold)
  277. #else
  278. if (mask_alpha < _DissolveThreshold)
  279. #endif
  280. {
  281. discard;
  282. }
  283. #endif
  284. // 全息颜色故障效果处理
  285. float color_glicth_noise = SampleNoiseMap(float2(_Time.x * _HologramColorGlitchData.x, _Time.x * _HologramColorGlitchData.y));
  286. color_glicth_noise = color_glicth_noise * (1.0 - _HologramColorGlitchMin) + _HologramColorGlitchMin;
  287. color_glicth_noise = clamp(color_glicth_noise, 0.0, 1.0);
  288. float color_glitch = lerp(1.0, color_glicth_noise, _HologramColorGlitch * _HologramColorGlitchTog);
  289. // 菲涅尔反射
  290. float3 w_viewDir = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);;
  291. float3 w_normal = normalize(i.normalDir);
  292. float nDotV = dot(w_normal, w_viewDir);
  293. float rim_nDotV = 1.0 - nDotV;
  294. float fresnel = _FresnelScale * pow(rim_nDotV, _FresnelPower);
  295. float fresnel_alpha = clamp(_FresnelAlphaScale * pow(rim_nDotV, _FresnelAlphaPower), 0.0, 1.0);
  296. float4 fresnel_color = (float4(fresnel, fresnel, fresnel, 1.0) * float4(main_color.rgb, 1.0)) * fresnel_alpha;
  297. float3 mask_color = tex2D(_MainTex, i.uv).r;
  298. // 全息效果 扫描线
  299. float2 line1_uv = (i.posWorld.y * _HologramLine1Frequency + _Time.y * _HologramLine1Speed).xx;
  300. float line1 = clamp(tex2D(_HologramLine1, line1_uv).r, 0.0, 1.0);
  301. float4 line1_color = float4((main_color * line1).rgb, line1) * _HologramLine1Alpha;
  302. float line1_alpha = clamp(((main_color).a + (line1_color).w), 0.0 , 1.0);
  303. #if defined (_USE_SCANLINE2)
  304. float2 line2_uv = (i.posWorld.y * _HologramLine2Frequency + _Time.y * _HologramLine2Speed).xx;
  305. float line2 = clamp(tex2D(_HologramLine2, line2_uv).r, 0.0, 1.0);
  306. float4 line2_color = float4((main_color * line2).rgb, line2) * _HologramLine2Alpha;
  307. float line2_alpha = clamp(((main_color).a + (line2_color).w), 0.0 , 1.0);
  308. #else
  309. float4 line2_color = 0.0;
  310. float line2_alpha = 1.0;
  311. #endif
  312. // Grain 颗粒效果
  313. float grain_noise = SampleNoiseMap((i.posWorld.xy * _HologramGrainData.xy + _Time.y * _HologramGrainSpeed));
  314. float lerp_val = lerp(_HologramGrainData.z, _HologramGrainData.w, grain_noise);
  315. float grain_amount = lerp(0.0, lerp_val, _HologramGrainAffect);
  316. float4 resultColor = float4(
  317. ((main_color + fresnel_color + float4(line1_color.xyz + line2_color.xyz, 0.0) + grain_amount)).rgb,
  318. (line1_alpha * line2_alpha * mask_alpha * _HologramAlpha)) * color_glitch;
  319. #if defined(_USE_DISSOLVE_EFFECT)
  320. // 溶解相关
  321. // percentage 讲道理不会大于1的,大于1的情况上面就被迪斯咯的了,但pectange的整体趋势是随着_DissolveThreshold增加而增加这个是肯定的
  322. #if defined (_USE_DISSOLVE_MAP)
  323. fixed percentage = _DissolveThreshold / max(dissolveValue.r, 0.0001);
  324. #else
  325. fixed percentage = _DissolveThreshold / max(mask_alpha, 0.0001);
  326. #endif
  327. // 设置 溶解颜色->完全消融 的颜色过度
  328. // sign 根据范围返回一个标志,分别是小于0时返回-1,大于0时返回1,否则返回0(不过这里被优化掉了)
  329. fixed fadeOutEdge = saturate(1000.0 * (percentage - _DissolveFadeOutThreshold));
  330. fixed3 fadeOutEdgeColor = lerp(_DissolveFadeMidColor.rgb, _DissolveFadeOutColor.rgb, fadeOutEdge);
  331. // 设置 开始溶解->溶解颜色 的颜色过度
  332. fixed fadeMidAmount = saturate(1000.0 * (percentage - _DissolveFadeMidThreshold));
  333. fixed3 fadeMidAmountColor = lerp(_DissolveFadeInColor.rgb, fadeOutEdgeColor.rgb, fadeMidAmount);
  334. // 设置 源颜色->开始溶解 的颜色过度
  335. fixed fadeInEdge = saturate(1000.0 * (percentage - _DissolveFadeInThreshold));
  336. resultColor.rgb = lerp(resultColor.rgb, fadeMidAmountColor, fadeInEdge);
  337. #endif
  338. float mask_use_axis = i.mPos[(uint)_HologramMaskUseAxis];
  339. float mask_lerp_amount = mask_use_axis - _HologramYMask;
  340. resultColor.a = clamp(lerp(resultColor.a, 0, mask_lerp_amount), 0.0, resultColor.a);
  341. return resultColor;
  342. }
  343. v2f_hg CombineHologramAndAlphaTextureVertex(a2v_hg v)
  344. {
  345. v2f_hg o;
  346. #if defined(_USE_DISSOLVE_EFFECT)
  347. // 产生模型顶点方向上的扭曲系数
  348. float mask_use_axis = v.vertex[(uint)_HologramMaskUseAxis];
  349. fixed dir = -2 * _ReverseDissolveDirection + 1;
  350. float height_progressMid = lerp(_ModelHeightButton, _ModelHeightTop, _DissolveThreshold);
  351. float fadeMidAmount = saturate(1000.0 * (dir * mask_use_axis - height_progressMid)); // * 1000的作用是优化掉sign,避免可能产生的编译分支问题
  352. fixed vertex_amount = lerp(1.0, 0.0, fadeMidAmount);
  353. v.vertex.xyz += vertex_amount * VertexHologramOffset(v.vertex.xyz, _HologramGliterData1);
  354. v.vertex.xyz += vertex_amount * VertexHologramOffset(v.vertex.xyz, _HologramGliterData2);
  355. #else
  356. v.vertex.xyz += VertexHologramOffset(v.vertex.xyz, _HologramGliterData1);
  357. v.vertex.xyz += VertexHologramOffset(v.vertex.xyz, _HologramGliterData2);
  358. #endif
  359. o.mPos = v.vertex;
  360. o.posWorld = mul(unity_ObjectToWorld, v.vertex);
  361. o.pos = mul(UNITY_MATRIX_VP, o.posWorld);
  362. o.uv = v.uv;
  363. o.normalDir = mul((float3x3)unity_ObjectToWorld, v.normal);
  364. return o;
  365. }
  366. float4 CombineHologramAndAlphaTextureFragment(v2f_hg i) : SV_Target
  367. {
  368. float4 main_color = _HologramColor;
  369. // 用主纹理的r通道做全息颜色蒙版
  370. float2 mask_uv = i.uv.xy * _HologramMaskMap_ST.xy + _HologramMaskMap_ST.zw;
  371. float4 mask = tex2D(_HologramMaskMap, mask_uv);
  372. float channel_max = max(max(mask.r, mask.g), mask.b);
  373. float mask_alpha = lerp(1, channel_max, _HologramMaskAffect);
  374. #if defined(_USE_DISSOLVE_EFFECT) || defined (_USE_DISSOLVE_MAP)
  375. float2 dissolve_uv = TRANSFORM_TEX(i.uv, _DissolveMap);
  376. fixed4 dissolveValue = tex2D(_DissolveMap, dissolve_uv);
  377. #endif
  378. // 全息颜色故障效果处理
  379. float color_glicth_noise = SampleNoiseMap(float2(_Time.x * _HologramColorGlitchData.x, _Time.x * _HologramColorGlitchData.y));
  380. color_glicth_noise = color_glicth_noise * (1.0 - _HologramColorGlitchMin) + _HologramColorGlitchMin;
  381. color_glicth_noise = clamp(color_glicth_noise, 0.0, 1.0);
  382. float color_glitch = lerp(1.0, color_glicth_noise, _HologramColorGlitch * _HologramColorGlitchTog);
  383. // 菲涅尔反射
  384. float3 w_viewDir = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);;
  385. float3 w_normal = normalize(i.normalDir);
  386. float nDotV = dot(w_normal, w_viewDir);
  387. float rim_nDotV = 1.0 - nDotV;
  388. float fresnel = _FresnelScale * pow(rim_nDotV, _FresnelPower);
  389. float fresnel_alpha = clamp(_FresnelAlphaScale * pow(rim_nDotV, _FresnelAlphaPower), 0.0, 1.0);
  390. float4 fresnel_color = (float4(fresnel, fresnel, fresnel, 1.0) * float4(main_color.rgb, 1.0)) * fresnel_alpha;
  391. float3 mask_color = tex2D(_MainTex, i.uv).r;
  392. // 全息效果 扫描线
  393. float2 line1_uv = (i.posWorld.y * _HologramLine1Frequency + _Time.y * _HologramLine1Speed).xx;
  394. float line1 = clamp(tex2D(_HologramLine1, line1_uv).r, 0.0, 1.0);
  395. float4 line1_color = float4((main_color * line1).rgb, line1) * _HologramLine1Alpha;
  396. float line1_alpha = clamp(((main_color).a + (line1_color).w), 0.0 , 1.0);
  397. #if defined (_USE_SCANLINE2)
  398. float2 line2_uv = (i.posWorld.y * _HologramLine2Frequency + _Time.y * _HologramLine2Speed).xx;
  399. float line2 = clamp(tex2D(_HologramLine2, line2_uv).r, 0.0, 1.0);
  400. float4 line2_color = float4((main_color * line2).rgb, line2) * _HologramLine2Alpha;
  401. float line2_alpha = clamp(((main_color).a + (line2_color).w), 0.0 , 1.0);
  402. #else
  403. float4 line2_color = 0.0;
  404. float line2_alpha = 1.0;
  405. #endif
  406. // Grain 颗粒效果
  407. float grain_noise = SampleNoiseMap((i.posWorld.xy * _HologramGrainData.xy + _Time.y * _HologramGrainSpeed));
  408. float lerp_val = lerp(_HologramGrainData.z, _HologramGrainData.w, grain_noise);
  409. float grain_amount = lerp(0.0, lerp_val, _HologramGrainAffect);
  410. float4 hologram_color = float4(
  411. ((main_color + fresnel_color + float4(line1_color.xyz + line2_color.xyz, 0.0) + grain_amount)).rgb,
  412. (line1_alpha * line2_alpha * mask_alpha * _HologramAlpha)) * color_glitch;
  413. // 提前获取最终蒙版轴向
  414. float mask_use_axis = i.mPos[(uint)_HologramMaskUseAxis];
  415. // 处理最终颜色
  416. fixed4 final_color;
  417. final_color.a = hologram_color.a;
  418. #if defined(_USE_DISSOLVE_EFFECT)
  419. // 溶解相关
  420. float height_allout = lerp(_ModelHeightButton, _ModelHeightTop, _DissolveThreshold - 2 * _DissolveFadeGap);
  421. float height_progressOut = lerp(_ModelHeightButton, _ModelHeightTop, _DissolveThreshold - _DissolveFadeGap);
  422. float height_progressMid = lerp(_ModelHeightButton, _ModelHeightTop, _DissolveThreshold);
  423. float height_progressIn = lerp(_ModelHeightButton, _ModelHeightTop, _DissolveThreshold + _DissolveFadeGap);
  424. // 设置完全消融 -> alphaTexture颜色过度
  425. fixed dir = -2 * _ReverseDissolveDirection + 1;
  426. fixed fadeAllOut = saturate(1000.0 * (dir * mask_use_axis - height_allout)); // * 1000的作用是优化掉sign,避免可能产生的编译分支问题
  427. fixed3 fadeAllOutColor = lerp(_DissolveFadeOutColor.rgb, mask.rgb * _AlphaTexColor.rgb, fadeAllOut);
  428. final_color.a = lerp(final_color.a, 1, fadeAllOut); // 处理透明度,但不要影响到全息的透明度
  429. // 设置 溶解颜色->完全消融 的颜色过度
  430. // sign 根据范围返回一个标志,分别是小于0时返回-1,大于0时返回1,否则返回0(不过这里被优化掉了)
  431. fixed fadeOutEdge = saturate(1000.0 * (dir * mask_use_axis - height_progressOut));
  432. fixed3 fadeOutEdgeColor = lerp(_DissolveFadeMidColor.rgb, fadeAllOutColor.rgb, fadeOutEdge);
  433. // 设置 开始溶解->溶解颜色 的颜色过度
  434. fixed fadeMidAmount = saturate(1000.0 * (dir * mask_use_axis - height_progressMid));
  435. fixed3 fadeMidAmountColor = lerp(_DissolveFadeInColor.rgb, fadeOutEdgeColor.rgb, fadeMidAmount);
  436. // 设置 源颜色->开始溶解 的颜色过度
  437. fixed fadeInEdge = saturate(1000.0 * (dir * mask_use_axis - height_progressIn));
  438. hologram_color.rgb = lerp(hologram_color.rgb, fadeMidAmountColor, fadeInEdge);
  439. #endif
  440. // 轴向淡出,不受任何上述效果的影响,直接裁剪掉alpha值
  441. float mask_lerp_amount = mask_use_axis - _HologramYMask;
  442. final_color.a = clamp(lerp(final_color.a, 0, mask_lerp_amount), 0.0, final_color.a);
  443. // 预乘透明度
  444. final_color.rgb = hologram_color.rgb * final_color.a;
  445. return final_color;
  446. }
  447. #endif // MAINROLE_EFFECT_CG_INCLUDED