uniform mat4 U; // Undistortion uniform float maxRadSq; // GoogleVR Distortion using Vertex Displacement float distortionFactor(const float rSquared) { float ret = 0.0; ret = rSquared * (ret + U[1][1]); ret = rSquared * (ret + U[0][1]); ret = rSquared * (ret + U[3][0]); ret = rSquared * (ret + U[2][0]); ret = rSquared * (ret + U[1][0]); ret = rSquared * (ret + U[0][0]); return ret + 1.0; } // Convert point from world space to undistorted camera space vec4 undistort(const mat4 WV, vec4 pos) { // Go to camera space pos = WV * pos; const float nearClip = 0.1; if (pos.z <= -nearClip) { // Reminder: Forward is -Z // Undistort the point's coordinates in XY float r2 = clamp(dot(pos.xy, pos.xy) / (pos.z * pos.z), 0.0, maxRadSq); pos.xy *= distortionFactor(r2); } return pos; }