27 lines
		
	
	
		
			801 B
		
	
	
	
		
			GLSL
		
	
	
	
	
	
			
		
		
	
	
			27 lines
		
	
	
		
			801 B
		
	
	
	
		
			GLSL
		
	
	
	
	
	
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;
 | 
						|
}
 |