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