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