27 lines
795 B
Text
27 lines
795 B
Text
|
uniform mat4 U; // Undistortion
|
||
|
uniform float maxRadSq;
|
||
|
|
||
|
// GoogleVR Distortion using Vertex Displacement
|
||
|
float distortionFactor(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;
|
||
|
}
|