From 4207f9c279e832e3afcb3f5fc6cd8d84cb4cfe4c Mon Sep 17 00:00:00 2001 From: Sven Gothel <sgothel@jausoft.com> Date: Sat, 28 Mar 2015 01:43:35 +0100 Subject: Bump OculusVR RIFT SDK to 0.5.0.1 --- .../D3D1X/Shaders/DistortionTimewarpChroma_vs.vsh | 70 +++++++++++++++++----- 1 file changed, 54 insertions(+), 16 deletions(-) (limited to 'LibOVR/Src/CAPI/D3D1X/Shaders/DistortionTimewarpChroma_vs.vsh') diff --git a/LibOVR/Src/CAPI/D3D1X/Shaders/DistortionTimewarpChroma_vs.vsh b/LibOVR/Src/CAPI/D3D1X/Shaders/DistortionTimewarpChroma_vs.vsh index 7e5512b..1f62785 100644 --- a/LibOVR/Src/CAPI/D3D1X/Shaders/DistortionTimewarpChroma_vs.vsh +++ b/LibOVR/Src/CAPI/D3D1X/Shaders/DistortionTimewarpChroma_vs.vsh @@ -1,8 +1,8 @@ /************************************************************************************ -Filename : DistortionTimewarpChroma_vs.vsh +Filename : DistortionPositionTimewarpChroma_vs.vsh -Copyright : Copyright 2014 Oculus VR, LLC All Rights reserved. +Copyright : Copyright 2014 Oculus VR, LLC All Rights reserved. Licensed under the Oculus VR Rift SDK License Version 3.2 (the "License"); you may not use the Oculus VR Rift SDK except in compliance with the License, @@ -21,46 +21,84 @@ limitations under the License. ************************************************************************************/ +Texture2DMS<float,1> DepthTexture1x : register(t0); +Texture2DMS<float,2> DepthTexture2x : register(t1); +Texture2DMS<float,4> DepthTexture4x : register(t2); + +float depthMsaaSamples = -1.0; // -1 means it's disabled + float2 EyeToSourceUVScale; float2 EyeToSourceUVOffset; float4x4 EyeRotationStart; float4x4 EyeRotationEnd; +// DepthProjector values can also be calculated as: +// float DepthProjectorX = FarClip / (FarClip - NearClip); +// float DepthProjectorY = (-FarClip * NearClip) / (FarClip - NearClip); +float2 DepthProjector; +float2 DepthDimSize; + +float4 PositionFromDepth(float2 inTexCoord) +{ + float2 eyeToSourceTexCoord = inTexCoord * EyeToSourceUVScale + EyeToSourceUVOffset; + float linearDepth = 1.0; + + if(depthMsaaSamples > 0.0) + { + float depth; + if(depthMsaaSamples <= 1.5) + depth = DepthTexture1x.Load(int2(eyeToSourceTexCoord * DepthDimSize), 0).x; + else if(depthMsaaSamples <= 2.5) + depth = DepthTexture2x.Load(int2(eyeToSourceTexCoord * DepthDimSize), 0).x; + else + depth = DepthTexture4x.Load(int2(eyeToSourceTexCoord * DepthDimSize), 0).x; + + linearDepth = DepthProjector.y / (depth - DepthProjector.x); + } + + float4 retVal = float4(inTexCoord, 1, 1); + retVal.xyz *= linearDepth; + return retVal; +} + 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); + float4 inputPos = PositionFromDepth(inTexCoord); + float3 transformed = float3( mul ( rotMat, inputPos ).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 float1 oColor : COLOR, - out float2 oTexCoord0 : TEXCOORD0, - out float2 oTexCoord1 : TEXCOORD1, - out float2 oTexCoord2 : TEXCOORD2) +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 float1 oColor : COLOR, + out float2 oTexCoord0 : TEXCOORD0, + out float2 oTexCoord1 : TEXCOORD1, + out float2 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); // warped positions are a bit more involved, hence a separate function - oTexCoord0 = TimewarpTexCoordToWarpedPos(TexCoord0, lerpedEyeRot); + oTexCoord0 = TimewarpTexCoordToWarpedPos(TexCoord0, lerpedEyeRot); oTexCoord1 = TimewarpTexCoordToWarpedPos(TexCoord1, lerpedEyeRot); oTexCoord2 = TimewarpTexCoordToWarpedPos(TexCoord2, lerpedEyeRot); - oColor = Color.r; // Used for vignette fade. + oColor = Color.r; // Used for vignette fade. } -- cgit v1.2.3