distortion_fragment.glsl raw
1 #extension GL_OES_EGL_image_external : require
2
3 precision mediump float;
4
5 varying vec2 vTexCoord;
6 uniform samplerExternalOES uTexture;
7
8 uniform float uAspectRatio;
9 uniform float uCenterX;
10 uniform float uCenterY;
11 uniform float uZoomAmp;
12 uniform float uSigma;
13 uniform float uFovAspect;
14 uniform float uCosAngle;
15 uniform float uSinAngle;
16
17 void main() {
18 vec2 offset = vTexCoord - vec2(uCenterX, uCenterY);
19
20 vec2 rotated = vec2(
21 offset.x * uCosAngle + offset.y * uSinAngle,
22 -offset.x * uSinAngle + offset.y * uCosAngle
23 );
24
25 float rx = rotated.x / uFovAspect;
26 float ry = rotated.y;
27 float r = sqrt(rx * rx + ry * ry);
28
29 float zoomFactor = uZoomAmp * exp(-r * r / (2.0 * uSigma * uSigma));
30 float rRemapped = r * (1.0 - zoomFactor);
31
32 vec2 sampleRotated = vec2(rx, ry) * (rRemapped / max(r, 0.00001));
33 sampleRotated.x *= uFovAspect;
34
35 vec2 sampleOffset = vec2(
36 sampleRotated.x * uCosAngle - sampleRotated.y * uSinAngle,
37 sampleRotated.x * uSinAngle + sampleRotated.y * uCosAngle
38 );
39
40 vec2 sampleCoord = vec2(uCenterX, uCenterY) + sampleOffset;
41 sampleCoord = clamp(sampleCoord, vec2(0.0, 0.0), vec2(1.0, 1.0));
42
43 gl_FragColor = texture2D(uTexture, sampleCoord);
44 }
45