AVProVideo-Internal-Transition.shader 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. Shader "AVProVideo/Internal/Transition"
  2. {
  3. Properties
  4. {
  5. _MainTex ("Texture To", 2D) = "white" {}
  6. _FromTex ("Texture From", 2D) = "white" {}
  7. }
  8. SubShader
  9. {
  10. Tags { "RenderType"="Opaque" }
  11. LOD 100
  12. Pass
  13. {
  14. CGPROGRAM
  15. #pragma vertex vert
  16. #pragma fragment frag
  17. // TODO: replace use multi_compile_local instead (Unity 2019.1 feature)
  18. #pragma multi_compile LERP_NONE LERP_FADE LERP_BLACK LERP_WHITE LERP_TRANSP LERP_HORIZ LERP_HORIZ_MIRROR LERP_VERT LERP_VERT_MIRROR LERP_DIAG LERP_DIAG_MIRROR LERP_CIRCLE LERP_SCROLL_VERT LERP_SCROLL_HORIZ LERP_DIAMOND LERP_BLINDS LERP_RECTS_VERT LERP_ARROW LERP_SLIDE_HORIZ LERP_SLIDE_VERT LERP_ZOOM_FADE
  19. #include "UnityCG.cginc"
  20. #include "../AVProVideo.cginc"
  21. struct appdata
  22. {
  23. float4 vertex : POSITION;
  24. float2 uv : TEXCOORD0;
  25. };
  26. struct v2f
  27. {
  28. float2 uv : TEXCOORD0;
  29. float4 vertex : SV_POSITION;
  30. };
  31. sampler2D _MainTex;
  32. sampler2D _FromTex;
  33. float4 _MainTex_ST;
  34. float4 _FromTex_ST;
  35. float _Fade;
  36. v2f vert (appdata v)
  37. {
  38. v2f o;
  39. o.vertex = XFormObjectToClip(v.vertex);
  40. o.uv = TRANSFORM_TEX(v.uv, _MainTex);
  41. return o;
  42. }
  43. fixed4 frag (v2f i) : SV_Target
  44. {
  45. float2 uv1 = i.uv;
  46. float2 uv2 = i.uv;
  47. #if LERP_FADE
  48. float t = _Fade;
  49. #elif LERP_BLACK
  50. float t = _Fade;
  51. if (t < 0.5)
  52. {
  53. return lerp(tex2D(_FromTex, uv1), float4(0.0, 0.0, 0.0, 1.0), t * 2.0);
  54. }
  55. else
  56. {
  57. return lerp(float4(0.0, 0.0, 0.0, 1.0), tex2D(_MainTex, uv2), 2.0 * (t - 0.5));
  58. }
  59. #elif LERP_WHITE
  60. float t = _Fade;
  61. if (t < 0.5)
  62. {
  63. return lerp(tex2D(_FromTex, uv1), float4(1.0, 1.0, 1.0, 1.0), t * 2.0);
  64. }
  65. else
  66. {
  67. return lerp(float4(1.0, 1.0, 1.0, 1.0), tex2D(_MainTex, uv2), 2.0 * (t - 0.5));
  68. }
  69. #elif LERP_TRANSP
  70. float t = _Fade;
  71. if (t < 0.5)
  72. {
  73. return lerp(tex2D(_FromTex, uv1), float4(0.0, 0.0, 0.0, 0.0), t * 2.0);
  74. }
  75. else
  76. {
  77. return lerp(float4(0.0, 0.0, 0.0, 0.0), tex2D(_MainTex, uv2), 2.0 * (t - 0.5));
  78. }
  79. #elif LERP_HORIZ
  80. float t = step(i.uv.x, _Fade);
  81. #elif LERP_HORIZ_MIRROR
  82. float t = step(abs(i.uv.x - 0.5), _Fade);
  83. #elif LERP_VERT
  84. float t = step(i.uv.y, _Fade);
  85. #elif LERP_VERT_MIRROR
  86. float t = step(abs(i.uv.y - 0.5), _Fade);
  87. #elif LERP_DIAG
  88. float t = step((i.uv.y+i.uv.x)*0.5, _Fade);
  89. #elif LERP_DIAG_MIRROR
  90. float t = step(abs(i.uv.y - i.uv.x), _Fade);
  91. #elif LERP_CIRCLE
  92. float t = distance(float2(i.uv.x*1.777, i.uv.y), float2(0.5*1.7777, 0.5));
  93. t = step(t, _Fade*2.1);
  94. #elif LERP_SCROLL_VERT
  95. float t = _Fade;
  96. uv1.y += _Fade;
  97. t = step(1 - uv1.y, 0);
  98. #elif LERP_SCROLL_HORIZ
  99. float t = _Fade;
  100. uv1.x += _Fade;
  101. t = step(1 - uv1.x, 0);
  102. #elif LERP_DIAMOND
  103. float2 origin = float2(0.5 * 1.7777, 0.5);
  104. float t = abs(uv1.x*1.7777 - origin.x);
  105. t += abs(uv1.y - origin.y);
  106. t = step(t, _Fade*1.4);
  107. #elif LERP_BLINDS
  108. float x = frac(uv1.x*4.0);
  109. float t = step(x, _Fade);
  110. #elif LERP_ARROW
  111. // Arrow
  112. float y = abs(i.uv.y - 0.5) * 0.5;
  113. float x = lerp(0.5, 1.0, i.uv.x);
  114. float t = step(x, y + _Fade);
  115. #elif LERP_SLIDE_HORIZ
  116. // Slide horiz
  117. float t = _Fade;
  118. uv1.x += _Fade;
  119. uv2.x -= 1.0 - _Fade;
  120. t = step(1 - uv1.x, 0);
  121. #elif LERP_SLIDE_VERT
  122. // slide vert
  123. float t = _Fade;
  124. uv1.y += _Fade;
  125. uv2.y -= 1.0 - _Fade;
  126. t = step(1 - uv1.y, 0);
  127. #elif LERP_ZOOM_FADE
  128. // zoom-fade
  129. float scale = lerp(1.0, 0.15, _Fade);
  130. float scale2 = lerp(1.0, 0.15, 1.0-_Fade);
  131. uv1 -= 0.5;
  132. uv2 -= 0.5;
  133. uv1 *= scale;
  134. uv2 *= scale2;
  135. uv1 += 0.5;
  136. uv2 += 0.5;
  137. float t = smoothstep(0.5, 1.0, _Fade);
  138. #elif LERP_RECTS_VERT
  139. float x = uv1.x;
  140. float bf = _Fade / 1.5;
  141. bf = frac(uv1.y * 8.0);
  142. bf = (int)fmod(uv1.y * 8.0, 8.0);
  143. bf += 1.0;
  144. bf *= _Fade / 2.0;
  145. float t = step(abs(x - 0.5), bf);
  146. #endif
  147. #if LERP_NONE
  148. return tex2D(_MainTex, uv1);
  149. #else
  150. float4 cola = tex2D(_FromTex, uv1);
  151. float4 colb = tex2D(_MainTex, uv2);
  152. float4 col = lerp(cola, colb, t);
  153. return col;
  154. #endif
  155. }
  156. ENDCG
  157. }
  158. }
  159. }