SoftMask.cginc 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #ifndef UI_SOFTMASK_INCLUDED
  2. #define UI_SOFTMASK_INCLUDED
  3. sampler2D _SoftMaskTex;
  4. float _Stencil;
  5. float4x4 _GameVP;
  6. float4x4 _GameTVP;
  7. half4 _MaskInteraction;
  8. float CustomStep(float a, float x)
  9. {
  10. return x >= a;
  11. }
  12. fixed Approximately(float4x4 a, float4x4 b)
  13. {
  14. float4x4 d = a - b;
  15. d = float4x4(
  16. abs(d[0]),
  17. abs(d[1]),
  18. abs(d[2]),
  19. abs(d[3])
  20. );
  21. return step(
  22. max(d._m00,max(d._m01,max(d._m02,max(d._m03,
  23. max(d._m10,max(d._m11,max(d._m12,max(d._m13,
  24. max(d._m20,max(d._m21,max(d._m22,max(d._m23,
  25. max(d._m30,max(d._m31,max(d._m32,d._m33))))))))))))))),
  26. 0.5);
  27. }
  28. #if SOFTMASK_EDITOR
  29. float SoftMaskInternal(float4 clipPos, float4 wpos)
  30. #else
  31. float SoftMaskInternal(float4 clipPos)
  32. #endif
  33. {
  34. half2 view = clipPos.xy/_ScreenParams.xy;
  35. #if SOFTMASK_EDITOR
  36. fixed isSceneView = 1 - Approximately(UNITY_MATRIX_VP, _GameVP);
  37. float4 cpos = mul(_GameTVP, mul(UNITY_MATRIX_M, wpos));
  38. view = lerp(view, cpos.xy / cpos.w * 0.5 + 0.5, isSceneView);
  39. #if UNITY_UV_STARTS_AT_TOP
  40. view.y = lerp(view.y, 1 - view.y, CustomStep(0, _ProjectionParams.x));
  41. #endif
  42. #elif UNITY_UV_STARTS_AT_TOP
  43. view.y = lerp(view.y, 1 - view.y, CustomStep(0, _ProjectionParams.x));
  44. #endif
  45. fixed4 mask = tex2D(_SoftMaskTex, view);
  46. half4 alpha = saturate(lerp(fixed4(1, 1, 1, 1), lerp(mask, 1 - mask, _MaskInteraction - 1), _MaskInteraction));
  47. #if SOFTMASK_EDITOR
  48. alpha *= CustomStep(0, view.x) * CustomStep(view.x, 1) * CustomStep(0, view.y) * CustomStep(view.y, 1);
  49. #endif
  50. return alpha.x * alpha.y * alpha.z * alpha.w;
  51. }
  52. #if SOFTMASK_EDITOR
  53. #define SOFTMASK_EDITOR_ONLY(x) x
  54. #define SoftMask(clipPos, worldPosition) SoftMaskInternal(clipPos, worldPosition)
  55. #else
  56. #define SOFTMASK_EDITOR_ONLY(x)
  57. #define SoftMask(clipPos, worldPosition) SoftMaskInternal(clipPos)
  58. #endif
  59. #endif // UI_SOFTMASK_INCLUDED