ProjectArcade
93 строки · 2.0 Кб
1/*
2[configuration]
3
4[OptionRangeFloat]
5GUIName = Distortion amount
6OptionName = DISTORTION_FACTOR
7MinValue = 1.0
8MaxValue = 10.0
9StepAmount = 0.5
10DefaultValue = 4.0
11
12[OptionRangeFloat]
13GUIName = Eye Distance Offset
14OptionName = EYE_OFFSET
15MinValue = 0.0
16MaxValue = 10.0
17StepAmount = 0.25
18DefaultValue = 5.0
19
20[OptionRangeFloat]
21GUIName = Zoom adjustment
22OptionName = SIZE_ADJUST
23MinValue = 0.0
24MaxValue = 1.0
25StepAmount = 0.025
26DefaultValue = 0.5
27
28[OptionRangeFloat]
29GUIName = Aspect Ratio adjustment
30OptionName = ASPECT_ADJUST
31MinValue = 0.0
32MaxValue = 1.0
33StepAmount = 0.025
34DefaultValue = 0.5
35
36[/configuration]
37*/
38
39
40void main()
41{
42// Base Cardboard distortion parameters
43float factor = GetOption(DISTORTION_FACTOR) * 0.01f;
44float ka = factor * 3.0f;
45float kb = factor * 5.0f;
46
47// size and aspect adjustment
48float sizeAdjust = 1.0f - GetOption(SIZE_ADJUST) + 0.5f;
49float aspectAdjustment = 1.25f - GetOption(ASPECT_ADJUST);
50
51// offset centering per eye
52float stereoOffset = GetOption(EYE_OFFSET) * 0.01f;
53float offsetAdd;
54
55// layer0 = left eye, layer1 = right eye
56if (layer == 1)
57{
58offsetAdd = stereoOffset;
59}
60else
61{
62offsetAdd = 0.0 - stereoOffset;
63}
64
65// convert coordinates to NDC space
66float2 fragPos = (GetCoordinates() - 0.5f - vec2(offsetAdd, 0.0f)) * 2.0f;
67
68// Calculate the source location "radius" (distance from the centre of the viewport)
69float destR = length(fragPos);
70
71// find the radius multiplier
72float srcR = destR * sizeAdjust + ( ka * pow(destR, 2.0) + kb * pow(destR, 4.0));
73
74// Calculate the source vector (radial)
75vec2 correctedRadial = normalize(fragPos) * srcR;
76
77// fix aspect ratio
78vec2 widenedRadial = correctedRadial * vec2(aspectAdjustment, 1.0f);
79
80// Transform the coordinates (from [-1,1]^2 to [0, 1]^2)
81vec2 uv = (widenedRadial/2.0f) + vec2(0.5f) + vec2(offsetAdd, 0.0f);
82
83// Sample the texture at the source location
84if(clamp(uv, 0.0, 1.0) != uv)
85{
86// black if beyond bounds
87SetOutput(float4(0.0, 0.0, 0.0, 0.0));
88}
89else
90{
91SetOutput(SampleLocation(uv));
92}
93}
94