Merge pull request #4209 from jasonphillips/lens-distortion-shader
lens distortion post-processing shader
This commit is contained in:
commit
54a643a4a3
|
@ -0,0 +1,93 @@
|
|||
/*
|
||||
[configuration]
|
||||
|
||||
[OptionRangeFloat]
|
||||
GUIName = Distortion amount
|
||||
OptionName = DISTORTION_FACTOR
|
||||
MinValue = 1.0
|
||||
MaxValue = 10.0
|
||||
StepAmount = 0.5
|
||||
DefaultValue = 4.0
|
||||
|
||||
[OptionRangeFloat]
|
||||
GUIName = Eye Distance Offset
|
||||
OptionName = EYE_OFFSET
|
||||
MinValue = 0.0
|
||||
MaxValue = 10.0
|
||||
StepAmount = 0.25
|
||||
DefaultValue = 5.0
|
||||
|
||||
[OptionRangeFloat]
|
||||
GUIName = Zoom adjustment
|
||||
OptionName = SIZE_ADJUST
|
||||
MinValue = 0.0
|
||||
MaxValue = 1.0
|
||||
StepAmount = 0.025
|
||||
DefaultValue = 0.5
|
||||
|
||||
[OptionRangeFloat]
|
||||
GUIName = Aspect Ratio adjustment
|
||||
OptionName = ASPECT_ADJUST
|
||||
MinValue = 0.0
|
||||
MaxValue = 1.0
|
||||
StepAmount = 0.025
|
||||
DefaultValue = 0.5
|
||||
|
||||
[/configuration]
|
||||
*/
|
||||
|
||||
|
||||
void main()
|
||||
{
|
||||
// Base Cardboard distortion parameters
|
||||
float factor = GetOption(DISTORTION_FACTOR) * 0.01f;
|
||||
float ka = factor * 3.0f;
|
||||
float kb = factor * 5.0f;
|
||||
|
||||
// size and aspect adjustment
|
||||
float sizeAdjust = 1.0f - GetOption(SIZE_ADJUST) + 0.5f;
|
||||
float aspectAdjustment = 1.25f - GetOption(ASPECT_ADJUST);
|
||||
|
||||
// offset centering per eye
|
||||
float stereoOffset = GetOption(EYE_OFFSET) * 0.01f;
|
||||
float offsetAdd;
|
||||
|
||||
// layer0 = left eye, layer1 = right eye
|
||||
if (layer == 1)
|
||||
{
|
||||
offsetAdd = stereoOffset;
|
||||
}
|
||||
else
|
||||
{
|
||||
offsetAdd = 0.0 - stereoOffset;
|
||||
}
|
||||
|
||||
// convert coordinates to NDC space
|
||||
float2 fragPos = (GetCoordinates() - 0.5f - vec2(offsetAdd, 0.0f)) * 2.0f;
|
||||
|
||||
// Calculate the source location "radius" (distance from the centre of the viewport)
|
||||
float destR = length(fragPos);
|
||||
|
||||
// find the radius multiplier
|
||||
float srcR = destR * sizeAdjust + ( ka * pow(destR, 2.0) + kb * pow(destR, 4.0));
|
||||
|
||||
// Calculate the source vector (radial)
|
||||
vec2 correctedRadial = normalize(fragPos) * srcR;
|
||||
|
||||
// fix aspect ratio
|
||||
vec2 widenedRadial = correctedRadial * vec2(aspectAdjustment, 1.0f);
|
||||
|
||||
// Transform the coordinates (from [-1,1]^2 to [0, 1]^2)
|
||||
vec2 uv = (widenedRadial/2.0f) + vec2(0.5f) + vec2(offsetAdd, 0.0f);
|
||||
|
||||
// Sample the texture at the source location
|
||||
if(clamp(uv, 0.0, 1.0) != uv)
|
||||
{
|
||||
// black if beyond bounds
|
||||
SetOutput(float4(0.0, 0.0, 0.0, 0.0));
|
||||
}
|
||||
else
|
||||
{
|
||||
SetOutput(SampleLocation(uv));
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue