diff options
Diffstat (limited to 'LibOVR/Src/CAPI/Shaders')
-rw-r--r-- | LibOVR/Src/CAPI/Shaders/DistortionChroma_ps.psh | 12 | ||||
-rw-r--r-- | LibOVR/Src/CAPI/Shaders/DistortionChroma_vs.vsh | 24 | ||||
-rw-r--r-- | LibOVR/Src/CAPI/Shaders/DistortionTimewarpChroma_vs.vsh | 40 | ||||
-rw-r--r-- | LibOVR/Src/CAPI/Shaders/DistortionTimewarp_vs.vsh | 36 | ||||
-rw-r--r-- | LibOVR/Src/CAPI/Shaders/Distortion_ps.psh | 9 | ||||
-rw-r--r-- | LibOVR/Src/CAPI/Shaders/Distortion_vs.vsh | 14 | ||||
-rw-r--r-- | LibOVR/Src/CAPI/Shaders/SimpleQuad_ps.psh | 6 | ||||
-rw-r--r-- | LibOVR/Src/CAPI/Shaders/SimpleQuad_vs.vsh | 8 | ||||
-rw-r--r-- | LibOVR/Src/CAPI/Shaders/genPixelShaderHeader.bat | 15 | ||||
-rw-r--r-- | LibOVR/Src/CAPI/Shaders/genVertexShaderHeader.bat | 15 |
10 files changed, 179 insertions, 0 deletions
diff --git a/LibOVR/Src/CAPI/Shaders/DistortionChroma_ps.psh b/LibOVR/Src/CAPI/Shaders/DistortionChroma_ps.psh new file mode 100644 index 0000000..5c95ade --- /dev/null +++ b/LibOVR/Src/CAPI/Shaders/DistortionChroma_ps.psh @@ -0,0 +1,12 @@ +Texture2D Texture : register(t0); +SamplerState Linear : register(s0); + +float4 main(in float4 oPosition : SV_Position, in float4 oColor : COLOR, + in float3 oTexCoord0 : TEXCOORD0, in float3 oTexCoord1 : TEXCOORD1, in float3 oTexCoord2 : TEXCOORD2) : SV_Target +{ + float ResultR = Texture.Sample(Linear, oTexCoord0.xy).r; + float ResultG = Texture.Sample(Linear, oTexCoord1.xy).g; + float ResultB = Texture.Sample(Linear, oTexCoord2.xy).b; + return float4(ResultR * oColor.r, ResultG * oColor.g, ResultB * oColor.b, 1.0); + //" return oColor.rrrr; +} diff --git a/LibOVR/Src/CAPI/Shaders/DistortionChroma_vs.vsh b/LibOVR/Src/CAPI/Shaders/DistortionChroma_vs.vsh new file mode 100644 index 0000000..6e11647 --- /dev/null +++ b/LibOVR/Src/CAPI/Shaders/DistortionChroma_vs.vsh @@ -0,0 +1,24 @@ +float2 EyeToSourceUVScale; +float2 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; + + // Scale them into UV lookup space + float2 tc0scaled = EyeToSourceUVScale * TexCoord0 + EyeToSourceUVOffset; + float2 tc1scaled = EyeToSourceUVScale * TexCoord1 + EyeToSourceUVOffset; + float2 tc2scaled = EyeToSourceUVScale * TexCoord2 + EyeToSourceUVOffset; + + oTexCoord0 = float3(tc0scaled, 1); // R sample. + oTexCoord1 = float3(tc1scaled, 1); // G sample. + oTexCoord2 = float3(tc2scaled, 1); // B sample. + oColor = Color; // Used for vignette fade. +} + diff --git a/LibOVR/Src/CAPI/Shaders/DistortionTimewarpChroma_vs.vsh b/LibOVR/Src/CAPI/Shaders/DistortionTimewarpChroma_vs.vsh new file mode 100644 index 0000000..d629ddd --- /dev/null +++ b/LibOVR/Src/CAPI/Shaders/DistortionTimewarpChroma_vs.vsh @@ -0,0 +1,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. +} diff --git a/LibOVR/Src/CAPI/Shaders/DistortionTimewarp_vs.vsh b/LibOVR/Src/CAPI/Shaders/DistortionTimewarp_vs.vsh new file mode 100644 index 0000000..627970f --- /dev/null +++ b/LibOVR/Src/CAPI/Shaders/DistortionTimewarp_vs.vsh @@ -0,0 +1,36 @@ +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,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, + out float4 oPosition : SV_Position, out float4 oColor : COLOR, out float3 oTexCoord0 : TEXCOORD0) +{ + + 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 = float3(TimewarpTexCoordToWarpedPos(TexCoord0, lerpedEyeRot), 1); + oColor = Color.r; // Used for vignette fade. +} + + diff --git a/LibOVR/Src/CAPI/Shaders/Distortion_ps.psh b/LibOVR/Src/CAPI/Shaders/Distortion_ps.psh new file mode 100644 index 0000000..4a33de5 --- /dev/null +++ b/LibOVR/Src/CAPI/Shaders/Distortion_ps.psh @@ -0,0 +1,9 @@ +Texture2D Texture : register(t0); +SamplerState Linear : register(s0); + +float4 main(in float4 oPosition : SV_Position, in float4 oColor : COLOR, + in float3 oTexCoord0 : TEXCOORD0) : SV_Target +{ + float3 Result = Texture.Sample(Linear, oTexCoord0.xy).rgb; + return float4(Result.r * oColor.r, Result.g * oColor.g, Result.b * oColor.b, 1.0); +} diff --git a/LibOVR/Src/CAPI/Shaders/Distortion_vs.vsh b/LibOVR/Src/CAPI/Shaders/Distortion_vs.vsh new file mode 100644 index 0000000..d22ea02 --- /dev/null +++ b/LibOVR/Src/CAPI/Shaders/Distortion_vs.vsh @@ -0,0 +1,14 @@ +float2 EyeToSourceUVScale; +float2 EyeToSourceUVOffset; + +void main(in float2 Position : POSITION, in float4 Color : COLOR0, in float2 TexCoord0 : TEXCOORD0, + out float4 oPosition : SV_Position, out float4 oColor : COLOR, out float3 oTexCoord0 : TEXCOORD0) +{ + oPosition.x = Position.x; + oPosition.y = Position.y; + oPosition.z = 0.5; + oPosition.w = 1.0; + oTexCoord0 = float3(EyeToSourceUVScale * TexCoord0 + EyeToSourceUVOffset, 1); + oColor = Color; // Used for vignette fade. +} + diff --git a/LibOVR/Src/CAPI/Shaders/SimpleQuad_ps.psh b/LibOVR/Src/CAPI/Shaders/SimpleQuad_ps.psh new file mode 100644 index 0000000..9ea10cd --- /dev/null +++ b/LibOVR/Src/CAPI/Shaders/SimpleQuad_ps.psh @@ -0,0 +1,6 @@ +float4 Color; + +float4 main() : SV_Target +{ + return Color; +} diff --git a/LibOVR/Src/CAPI/Shaders/SimpleQuad_vs.vsh b/LibOVR/Src/CAPI/Shaders/SimpleQuad_vs.vsh new file mode 100644 index 0000000..4625371 --- /dev/null +++ b/LibOVR/Src/CAPI/Shaders/SimpleQuad_vs.vsh @@ -0,0 +1,8 @@ +float2 PositionOffset = float2(0, 0); +float2 Scale = float2(1, 1); + +void main( in float3 Position : POSITION, +out float4 oPosition : SV_Position) +{ + oPosition = float4(Position.xy * Scale + PositionOffset, 0.5, 1.0); +}
\ No newline at end of file diff --git a/LibOVR/Src/CAPI/Shaders/genPixelShaderHeader.bat b/LibOVR/Src/CAPI/Shaders/genPixelShaderHeader.bat new file mode 100644 index 0000000..a1311b2 --- /dev/null +++ b/LibOVR/Src/CAPI/Shaders/genPixelShaderHeader.bat @@ -0,0 +1,15 @@ +@echo off +pushd %~dp0 +echo Compiling shader and packing into header: %~2 +setlocal + +set PATH=%PATH%;"%DXSDK_DIR%Utilities\bin\x86\" +fxc.exe /nologo /E main /T ps_4_0 /Fo "%1" %2 +bin2header.exe "%1" + +echo Generating shader reflection data for %1 +ShaderReflector "%1" "%1_refl.h" + +del "%1" +endlocal +popd diff --git a/LibOVR/Src/CAPI/Shaders/genVertexShaderHeader.bat b/LibOVR/Src/CAPI/Shaders/genVertexShaderHeader.bat new file mode 100644 index 0000000..4591d20 --- /dev/null +++ b/LibOVR/Src/CAPI/Shaders/genVertexShaderHeader.bat @@ -0,0 +1,15 @@ +@echo off +pushd %~dp0 +echo Compiling shader and packing into header: %~2 +setlocal + +set PATH=%PATH%;"%DXSDK_DIR%Utilities\bin\x86\" +fxc.exe /nologo /E main /T vs_4_0 /Fo "%1" %2 +bin2header.exe "%1" + +echo Generating shader reflection data for %1 +ShaderReflector "%1" "%1_refl.h" + +del "%1" +endlocal +popd |