| 1234567891011121314151617181920212223242526 |
- 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;
- }
|