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