NewN_UAVPlane/Assets/Plugins/RenderHeads/AVProMovieCapture/Runtime/Resources/AVProMovieCapture_ODSMerge....

126 lines
2.7 KiB
GLSL

Shader "Hidden/AVProMovieCapture/ODSMerge"
{
Properties
{
}
SubShader
{
Lighting Off
ZTest Always
Cull Off
ZWrite Off
Fog { Mode off }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 3.0
#pragma multi_compile LAYOUT_EQUIRECT360 LAYOUT_EQUIRECT180
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
float2 uv : TEXCOORD0;
};
#define QUARTERPI 0.7853981633974483
uniform sampler2D _leftTopTex;
uniform sampler2D _leftBotTex;
uniform sampler2D _rightTopTex;
uniform sampler2D _rightBotTex;
uniform float4 _leftTopTex_TexelSize;
uniform float4 _leftBotTex_TexelSize;
uniform float4 _rightTopTex_TexelSize;
uniform float4 _rightBotTex_TexelSize;
uniform float _sliceCenter;
uniform float _pixelSliceSize;
uniform int _paddingSize;
uniform float _targetXTexelSize;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
fixed4 computePixelColour(float2 uv)
{
fixed4 col;
// uv.y > 0.5 is top of texture (left eye)
// uv.y < 0.5 is bottom of texture (right eye)
if (uv.y < 0.25f) {
uv.y = uv.y * 4.0;
float phi = ((uv.y - 0.5) * 2.0) * QUARTERPI;
uv.y = (tan(phi) * 0.5) + 0.5;
col = tex2D(_rightBotTex, uv);
}
else if (uv.y < 0.5) {
uv.y = (uv.y - 0.25) * 4.0;
float phi = ((uv.y - 0.5) * 2.0) * QUARTERPI;
uv.y = (tan(phi) * 0.5) + 0.5;
col = tex2D(_rightTopTex, uv);
}
else if (uv.y < 0.75) {
uv.y = (uv.y - 0.5) * 4.0;
float phi = ((uv.y - 0.5) * 2.0) * QUARTERPI;
uv.y = (tan(phi) * 0.5) + 0.5;
col = tex2D(_leftBotTex, uv);
}
else {
uv.y = (uv.y - 0.75) * 4.0;
float phi = ((uv.y - 0.5) * 2.0) * QUARTERPI;
uv.y = (tan(phi) * 0.5) + 0.5;
col = tex2D(_leftTopTex, uv);
}
return col;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = 0.0;
float column = float(_sliceCenter) * _targetXTexelSize;
float range = _pixelSliceSize * _targetXTexelSize / 2.0 + 0.000001;
#if defined(LAYOUT_EQUIRECT180)
float dif = ((i.uv.x + 0.5) * 0.5) - column;
#else
float dif = i.uv.x - column;
#endif
float adif = abs(dif);
if (adif < range)
{
float r = _pixelSliceSize * _targetXTexelSize / 2.0;
float rp = (_pixelSliceSize + 2.0 * _paddingSize) * _targetXTexelSize / 2.0;
float xRescaled = (dif < 0 ? r - adif : r + adif) / (rp * 2.0) + _paddingSize * _targetXTexelSize;
col = computePixelColour(float2(xRescaled, i.uv.y));
}
else
{
discard;
}
return col;
}
ENDCG
}
}
}