Quellcode durchsuchen

use universal shader in openglexample

James Sarrett vor 8 Jahren
Ursprung
Commit
4b5ca3e5a6

+ 36 - 6
examples/opengl/main.c

@@ -115,9 +115,30 @@ int main(int argc, char** argv)
 	ohmd_device_settings_seti(settings, OHMD_IDS_AUTOMATIC_UPDATE, &auto_update);
 
 	ohmd_device* hmd = ohmd_list_open_device_s(ctx, 0, settings);
+	float viewport_scale[2];
+	float distortion_coeffs[4];
+	float aberr_scale[3];
+	float sep;
+	float left_lens_center[2];
+	float right_lens_center[2];
+	//viewport is half the screen
+	ohmd_device_getf(hmd, OHMD_SCREEN_HORIZONTAL_SIZE, &(viewport_scale[0]));
+	viewport_scale[0] /= 2.0f;
+	ohmd_device_getf(hmd, OHMD_SCREEN_VERTICAL_SIZE, &(viewport_scale[1]));
+	//distortion coefficients
+	ohmd_device_getf(hmd, OHMD_UNIVERSAL_DISTORTION_K, &(distortion_coeffs[0]));
+	ohmd_device_getf(hmd, OHMD_UNIVERSAL_ABERRATION_K, &(aberr_scale[0]));
+	//calculate lens centers (assuming the eye separation is the distance betweenteh lense centers)
+	ohmd_device_getf(hmd, OHMD_LENS_HORIZONTAL_SEPARATION, &sep);
+	ohmd_device_getf(hmd, OHMD_LENS_VERTICAL_POSITION, &(left_lens_center[1]));
+	ohmd_device_getf(hmd, OHMD_LENS_VERTICAL_POSITION, &(right_lens_center[1]));
+	left_lens_center[0] = viewport_scale[0] - sep/2.0f;
+	right_lens_center[0] = sep/2.0f;
+	//asume calibration was for lens view to which ever edge of screen is further away from lens center
+	float warp_scale = (left_lens_center[0] > right_lens_center[0]) ? left_lens_center[0] : right_lens_center[0];
 
 	ohmd_device_settings_destroy(settings);
-	
+
 	if(!hmd){
 		printf("failed to open device: %s\n", ohmd_ctx_get_error(ctx));
 		return 1;
@@ -128,12 +149,16 @@ int main(int argc, char** argv)
 
 	SDL_ShowCursor(SDL_DISABLE);
 
-	char* vertex = read_file("shaders/test1.vert.glsl");
-	char* fragment = read_file("shaders/test1.frag.glsl");
+	const char* vertex = ohmd_gets(OHMD_GLSL_DISTORTION_VERT_SRC);
+	const char* fragment = ohmd_gets(OHMD_GLSL_DISTORTION_FRAG_SRC);
 
 	GLuint shader = compile_shader(vertex, fragment);
 	glUseProgram(shader);
 	glUniform1i(glGetUniformLocation(shader, "warpTexture"), 0);
+	glUniform2fv(glGetUniformLocation(shader, "ViewportScale"), 1, viewport_scale);
+	glUniform1f(glGetUniformLocation(shader, "WarpScale"), warp_scale);
+	glUniform4fv(glGetUniformLocation(shader, "HmdWarpParam"), 1, distortion_coeffs);
+	glUniform3fv(glGetUniformLocation(shader, "aberr"), 1, aberr_scale);
 	glUseProgram(0);
 
 	GLuint list = gen_cubes();
@@ -182,6 +207,12 @@ int main(int argc, char** argv)
 						printf("View: ");
 						print_matrix(mat);
 						printf("\n");
+						printf("viewport_scale: [%0.4f, %0.4f]\n", viewport_scale[0], viewport_scale[1]);
+						printf("warp_scale: %0.4f\r\n", warp_scale);
+						printf("distoriton coeffs: [%0.4f, %0.4f, %0.4f, %0.4f]\n", distortion_coeffs[0], distortion_coeffs[1], distortion_coeffs[2], distortion_coeffs[3]);
+						printf("aberration coeffs: [%0.4f, %0.4f, %0.4f]\n", aberr_scale[0], aberr_scale[1], aberr_scale[2]);
+						printf("left_lens_center: [%0.4f, %0.4f]\n", left_lens_center[0], left_lens_center[1]);
+						printf("right_lens_center: [%0.4f, %0.4f]\n", left_lens_center[0], left_lens_center[1]);
 					}
 					break;
 				default:
@@ -247,6 +278,7 @@ int main(int argc, char** argv)
 		glLoadIdentity();
 
 		// Draw left eye
+		glUniform2fv(glGetUniformLocation(shader, "LensCenter"), 1, left_lens_center);
 		glBindTexture(GL_TEXTURE_2D, left_color_tex);
 		glBegin(GL_QUADS);
 		glTexCoord2d( 0,  0);
@@ -260,6 +292,7 @@ int main(int argc, char** argv)
 		glEnd();
 
 		// Draw right eye
+		glUniform2fv(glGetUniformLocation(shader, "LensCenter"), 1, right_lens_center);
 		glBindTexture(GL_TEXTURE_2D, right_color_tex);
 		glBegin(GL_QUADS);
 		glTexCoord2d( 0,  0);
@@ -284,8 +317,5 @@ int main(int argc, char** argv)
 
 	ohmd_ctx_destroy(ctx);
 
-	free(vertex);
-	free(fragment);
-	
 	return 0;
 }

+ 0 - 43
examples/opengl/shaders/test1.frag.glsl

@@ -1,43 +0,0 @@
-#version 120
-
-// Taken from mts3d forums, from user fredrik.
-
-uniform sampler2D warpTexture;
-
-const vec2 LeftLensCenter = vec2(0.2863248, 0.5);
-const vec2 RightLensCenter = vec2(0.7136753, 0.5);
-const vec2 LeftScreenCenter = vec2(0.25, 0.5);
-const vec2 RightScreenCenter = vec2(0.75, 0.5);
-const vec2 Scale = vec2(0.1469278, 0.2350845);
-const vec2 ScaleIn = vec2(4, 2.5);
-const vec4 HmdWarpParam   = vec4(1, 0.22, 0.24, 0);
-
-// Scales input texture coordinates for distortion.
-vec2 HmdWarp(vec2 in01, vec2 LensCenter)
-{
-	vec2 theta = (in01 - LensCenter) * ScaleIn; // Scales to [-1, 1]
-	float rSq = theta.x * theta.x + theta.y * theta.y;
-	vec2 rvector = theta * (HmdWarpParam.x + HmdWarpParam.y * rSq +
-		HmdWarpParam.z * rSq * rSq +
-		HmdWarpParam.w * rSq * rSq * rSq);
-	return LensCenter + Scale * rvector;
-}
-
-void main()
-{
-	// The following two variables need to be set per eye
-	vec2 LensCenter = gl_FragCoord.x < 640 ? LeftLensCenter : RightLensCenter;
-	vec2 ScreenCenter = gl_FragCoord.x < 640 ? LeftScreenCenter : RightScreenCenter;
-
-	vec2 oTexCoord = gl_FragCoord.xy / vec2(1280, 800);
-
-	vec2 tc = HmdWarp(oTexCoord, LensCenter);
-	if (any(bvec2(clamp(tc,ScreenCenter-vec2(0.25,0.5), ScreenCenter+vec2(0.25,0.5)) - tc)))
-	{
-		gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
-		return;
-	}
-
-	tc.x = gl_FragCoord.x < 640 ? (2.0 * tc.x) : (2.0 * (tc.x - 0.5));
-	gl_FragColor = texture2D(warpTexture, tc);
-}

+ 0 - 8
examples/opengl/shaders/test1.vert.glsl

@@ -1,8 +0,0 @@
-#version 120
-
-void main(void)
-{
-	gl_TexCoord[0] = gl_MultiTexCoord0;
-	gl_Position = ftransform();
-}
-