aboutsummaryrefslogtreecommitdiffstats
path: root/LibOVR/Src/CAPI/Shaders/DistortionTimewarpChroma_vs.vsh
blob: 9650b7e1c4c4ef7ed4f7817429ca0f3a8fb7bf34 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
float2 EyeToSourceUVScale;
float2 EyeToSourceUVOffset;
float4x4 EyeRotationStart;
float4x4 EyeRotationEnd;

float2 TimewarpTexCoordToWarpedPos(float2 inTexCoord, float4x4 rotMat)
{
	// Vertex inputs are in TanEyeAngle space for the R,G,B channels (i.e. after chromatic aberration and distortion).
	// These are now "real world" vectors in direction (x,y,1) relative to the eye of the HMD.	
	// Apply the 3x3 timewarp rotation to these vectors.
	float3 transformed = float3( mul ( rotMat, float4(inTexCoord.xy, 1, 1) ).xyz);
	// Project them back onto the Z=1 plane of the rendered images.
	float2 flattened = transformed.xy / transformed.z;
	// Scale them into ([0,0.5],[0,1]) or ([0.5,0],[0,1]) UV lookup space (depending on eye)
	return flattened * EyeToSourceUVScale + EyeToSourceUVOffset;
	
}

void main(in float2 Position    : POSITION,    in float4 Color       : COLOR0,    in float2 TexCoord0 : TEXCOORD0,
          in float2 TexCoord1   : TEXCOORD1,   in float2 TexCoord2   : TEXCOORD2,
          out float4 oPosition  : SV_Position, out float4 oColor     : COLOR,     out float3 oTexCoord0 : TEXCOORD0,
          out float3 oTexCoord1 : TEXCOORD1,   out float3 oTexCoord2 : TEXCOORD2)
{

   oPosition.x = Position.x;
   oPosition.y = Position.y;
   oPosition.z = 0.5;
   oPosition.w = 1.0;
    	    
   float timewarpLerpFactor = Color.a;
   float4x4 lerpedEyeRot = lerp(EyeRotationStart, EyeRotationEnd, timewarpLerpFactor);	
	//"	float4x4 lerpedEyeRot = EyeRotationStart;

		// warped positions are a bit more involved, hence a separate function
	oTexCoord0 = float3(TimewarpTexCoordToWarpedPos(TexCoord0, lerpedEyeRot), 1);
	oTexCoord1 = float3(TimewarpTexCoordToWarpedPos(TexCoord1, lerpedEyeRot), 1);
	oTexCoord2 = float3(TimewarpTexCoordToWarpedPos(TexCoord2, lerpedEyeRot), 1);

   oColor = Color.r;              // Used for vignette fade.
}