AVProMovieCapture_ODSMerge.shader 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
  2. Shader "Hidden/AVProMovieCapture/ODSMerge"
  3. {
  4. Properties
  5. {
  6. }
  7. SubShader
  8. {
  9. Lighting Off
  10. ZTest Always
  11. Cull Off
  12. ZWrite Off
  13. Fog { Mode off }
  14. Pass
  15. {
  16. CGPROGRAM
  17. #pragma vertex vert
  18. #pragma fragment frag
  19. #pragma target 3.0
  20. #include "UnityCG.cginc"
  21. struct appdata
  22. {
  23. float4 vertex : POSITION;
  24. float2 uv : TEXCOORD0;
  25. };
  26. struct v2f
  27. {
  28. float4 vertex : SV_POSITION;
  29. float2 uv : TEXCOORD0;
  30. };
  31. uniform sampler2D _leftTopTex;
  32. uniform sampler2D _leftBotTex;
  33. uniform sampler2D _rightTopTex;
  34. uniform sampler2D _rightBotTex;
  35. uniform float4 _leftTopTex_TexelSize;
  36. uniform float4 _leftBotTex_TexelSize;
  37. uniform float4 _rightTopTex_TexelSize;
  38. uniform float4 _rightBotTex_TexelSize;
  39. uniform float _sliceCenter;
  40. uniform float _pixelSliceSize;
  41. uniform int _paddingSize;
  42. uniform float _targetXTexelSize;
  43. v2f vert (appdata v)
  44. {
  45. v2f o;
  46. o.vertex = UnityObjectToClipPos(v.vertex);
  47. o.uv = v.uv;
  48. return o;
  49. }
  50. fixed4 computePixelColour(float2 uv)
  51. {
  52. fixed4 col;
  53. // uv.y > 0.5 is top of texture (left eye)
  54. // uv.y < 0.5 is bottom of texture (right eye)
  55. if (uv.y < 0.25f) {
  56. uv.y = uv.y * 4.0;
  57. float phi = ((uv.y - 0.5) * 2) * 3.14159 * 0.25;
  58. uv.y = (tan(phi) * 0.5) + 0.5;
  59. col = tex2D(_rightBotTex, uv);
  60. }
  61. else if (uv.y < 0.5) {
  62. uv.y = (uv.y - 0.25) * 4.0;
  63. float phi = ((uv.y - 0.5) * 2) * 3.14159 * 0.25;
  64. uv.y = (tan(phi) * 0.5) + 0.5;
  65. col = tex2D(_rightTopTex, uv);
  66. }
  67. else if (uv.y < 0.75) {
  68. uv.y = (uv.y - 0.5) * 4.0;
  69. float phi = ((uv.y - 0.5) * 2) * 3.14159 * 0.25;
  70. uv.y = (tan(phi) * 0.5) + 0.5;
  71. col = tex2D(_leftBotTex, uv);
  72. }
  73. else {
  74. uv.y = (uv.y - 0.75) * 4.0;
  75. float phi = ((uv.y - 0.5) * 2) * 3.14159 * 0.25;
  76. uv.y = (tan(phi) * 0.5) + 0.5;
  77. col = tex2D(_leftTopTex, uv);
  78. }
  79. return col;
  80. }
  81. fixed4 frag (v2f i) : SV_Target
  82. {
  83. fixed4 col = 0.0;
  84. float column = float(_sliceCenter) * _targetXTexelSize;
  85. float range = _pixelSliceSize * _targetXTexelSize / 2.0 + 0.000001;
  86. float dif = i.uv.x - column;
  87. float adif = abs(dif);
  88. if (adif < range)
  89. {
  90. float r = _pixelSliceSize * _targetXTexelSize / 2.0;
  91. float rp = (_pixelSliceSize + 2.0 * _paddingSize) * _targetXTexelSize / 2.0;
  92. float xRescaled = (dif < 0 ? r - adif : r + adif) / (rp * 2.0) + _paddingSize * _targetXTexelSize;
  93. col = computePixelColour(float2(xRescaled, i.uv.y));
  94. }
  95. else
  96. {
  97. discard;
  98. }
  99. return col;
  100. }
  101. ENDCG
  102. }
  103. }
  104. }