Update openglexample
This commit is contained in:
@@ -11,9 +11,14 @@
|
||||
#include <stdbool.h>
|
||||
#include <assert.h>
|
||||
#include <math.h>
|
||||
#include "gl.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "gl.h"
|
||||
|
||||
#include <lvrc.h>
|
||||
|
||||
#include "vr_context.h"
|
||||
|
||||
#define OVERSAMPLE_SCALE 2.0
|
||||
|
||||
@@ -150,7 +155,19 @@ int main(int argc, char** argv)
|
||||
struct lvrcInstance * compositor = lvrcCreateInstance(hmd);
|
||||
|
||||
gl_ctx gl;
|
||||
init_gl(&gl, compositor);
|
||||
init_gl(&gl, hmd_w, hmd_h);
|
||||
|
||||
const char* vertex;
|
||||
ohmd_gets(OHMD_GLSL_DISTORTION_VERT_SRC, &vertex);
|
||||
const char* fragment;
|
||||
ohmd_gets(OHMD_GLSL_DISTORTION_FRAG_SRC, &fragment);
|
||||
|
||||
GLuint shader = compile_shader(vertex, fragment);
|
||||
glUseProgram(shader);
|
||||
glUniform1i(glGetUniformLocation(shader, "warpTexture"), 0);
|
||||
glUniform2fv(glGetUniformLocation(shader, "ViewportScale"), 1, viewport_scale);
|
||||
glUniform3fv(glGetUniformLocation(shader, "aberr"), 1, aberr_scale);
|
||||
glUseProgram(0);
|
||||
|
||||
GLuint list = gen_cubes();
|
||||
|
||||
@@ -162,6 +179,32 @@ int main(int argc, char** argv)
|
||||
GLuint right_color_tex = 0, right_depth_tex = 0, right_fbo = 0;
|
||||
create_fbo(eye_w, eye_h, &right_fbo, &right_color_tex, &right_depth_tex);
|
||||
|
||||
PFNEGLEXPORTDMABUFIMAGEMESAPROC eglExportDMABUFImage = (PFNEGLEXPORTDMABUFIMAGEMESAPROC) eglGetProcAddress("eglExportDMABUFImageMESA");
|
||||
PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC eglExportDMABUFImageQuery = (PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC) eglGetProcAddress("eglExportDMABUFImageQueryMESA");
|
||||
|
||||
#if 1
|
||||
EGLImage left_image = eglCreateImage(gl.egl_display, gl.egl_context, EGL_GL_TEXTURE_2D, (EGLClientBuffer)(left_color_tex), NULL);
|
||||
|
||||
dma_texture_params left_texture_params;
|
||||
left_texture_params.width = eye_w;
|
||||
left_texture_params.height = eye_h;
|
||||
eglExportDMABUFImageQuery(gl.egl_display, left_image, &left_texture_params.fourcc, &left_texture_params.numplanes, &left_texture_params.modifiers);
|
||||
eglExportDMABUFImage(gl.egl_display, left_image, &left_texture_params.fd, &left_texture_params.stride, &left_texture_params.offset);
|
||||
#endif // 0
|
||||
|
||||
#if 1
|
||||
EGLImage right_image = eglCreateImage(gl.egl_display, gl.egl_context, EGL_GL_TEXTURE_2D, (EGLClientBuffer)(right_color_tex), NULL);
|
||||
|
||||
dma_texture_params right_texture_params;
|
||||
right_texture_params.width = eye_w;
|
||||
right_texture_params.height = eye_h;
|
||||
eglExportDMABUFImageQuery(gl.egl_display, right_image, &right_texture_params.fourcc, &right_texture_params.numplanes, &right_texture_params.modifiers);
|
||||
eglExportDMABUFImage(gl.egl_display, right_image, &right_texture_params.fd, &right_texture_params.stride, &right_texture_params.offset);
|
||||
#endif // 0
|
||||
|
||||
extern void init_vr_context(struct lvrcInstance * compositor, dma_texture_params * left_texture_params, dma_texture_params * right_texture_params);
|
||||
init_vr_context(compositor, &left_texture_params, &right_texture_params);
|
||||
|
||||
bool bCompositorInit = lvrcInitFrameResources(compositor);
|
||||
|
||||
if (!bCompositorInit)
|
||||
@@ -172,104 +215,12 @@ int main(int argc, char** argv)
|
||||
bool done = false;
|
||||
bool crosshair_overlay = false;
|
||||
while(!done){
|
||||
|
||||
ohmd_ctx_update(ctx);
|
||||
|
||||
lvrcBeginFrame(compositor);
|
||||
|
||||
#if 0
|
||||
SDL_Event event;
|
||||
while(SDL_PollEvent(&event)){
|
||||
if(event.type == SDL_KEYDOWN){
|
||||
switch(event.key.keysym.sym){
|
||||
case SDLK_ESCAPE:
|
||||
done = true;
|
||||
break;
|
||||
case SDLK_F1:
|
||||
{
|
||||
gl.is_fullscreen = !gl.is_fullscreen;
|
||||
SDL_SetWindowFullscreen(gl.window, gl.is_fullscreen ? SDL_WINDOW_FULLSCREEN : 0);
|
||||
}
|
||||
break;
|
||||
case SDLK_F2:
|
||||
{
|
||||
// reset rotation and position
|
||||
float zero[] = {0, 0, 0, 1};
|
||||
ohmd_device_setf(hmd, OHMD_ROTATION_QUAT, zero);
|
||||
ohmd_device_setf(hmd, OHMD_POSITION_VECTOR, zero);
|
||||
}
|
||||
break;
|
||||
case SDLK_F3:
|
||||
{
|
||||
float mat[16];
|
||||
ohmd_device_getf(hmd, OHMD_LEFT_EYE_GL_PROJECTION_MATRIX, mat);
|
||||
printf("Projection L: ");
|
||||
print_matrix(mat);
|
||||
printf("\n");
|
||||
ohmd_device_getf(hmd, OHMD_RIGHT_EYE_GL_PROJECTION_MATRIX, mat);
|
||||
printf("Projection R: ");
|
||||
print_matrix(mat);
|
||||
printf("\n");
|
||||
ohmd_device_getf(hmd, OHMD_LEFT_EYE_GL_MODELVIEW_MATRIX, mat);
|
||||
printf("View: ");
|
||||
print_matrix(mat);
|
||||
printf("\n");
|
||||
printf("viewport_scale: [%0.4f, %0.4f]\n", viewport_scale[0], viewport_scale[1]);
|
||||
printf("lens separation: %04f\n", sep);
|
||||
printf("IPD: %0.4f\n", ipd);
|
||||
printf("warp_scale: %0.4f\r\n", warp_scale);
|
||||
printf("distortion 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", right_lens_center[0], right_lens_center[1]);
|
||||
}
|
||||
break;
|
||||
case SDLK_w:
|
||||
sep += 0.001;
|
||||
left_lens_center[0] = viewport_scale[0] - sep/2.0f;
|
||||
right_lens_center[0] = sep/2.0f;
|
||||
break;
|
||||
case SDLK_q:
|
||||
sep -= 0.001;
|
||||
left_lens_center[0] = viewport_scale[0] - sep/2.0f;
|
||||
right_lens_center[0] = sep/2.0f;
|
||||
break;
|
||||
case SDLK_a:
|
||||
warp_adj *= 1.0/0.9;
|
||||
break;
|
||||
case SDLK_z:
|
||||
warp_adj *= 0.9;
|
||||
break;
|
||||
case SDLK_i:
|
||||
ipd -= 0.001;
|
||||
ohmd_device_setf(hmd, OHMD_EYE_IPD, &ipd);
|
||||
break;
|
||||
case SDLK_o:
|
||||
ipd += 0.001;
|
||||
ohmd_device_setf(hmd, OHMD_EYE_IPD, &ipd);
|
||||
break;
|
||||
case SDLK_d:
|
||||
/* toggle between distorted and undistorted views */
|
||||
if ((distortion_coeffs[0] != 0.0) ||
|
||||
(distortion_coeffs[1] != 0.0) ||
|
||||
(distortion_coeffs[2] != 0.0) ||
|
||||
(distortion_coeffs[3] != 1.0)) {
|
||||
distortion_coeffs[0] = 0.0;
|
||||
distortion_coeffs[1] = 0.0;
|
||||
distortion_coeffs[2] = 0.0;
|
||||
distortion_coeffs[3] = 1.0;
|
||||
} else {
|
||||
ohmd_device_getf(hmd, OHMD_UNIVERSAL_DISTORTION_K, &(distortion_coeffs[0]));
|
||||
}
|
||||
break;
|
||||
case SDLK_x:
|
||||
crosshair_overlay = ! crosshair_overlay;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif // 0
|
||||
eglMakeCurrent(gl.egl_display, gl.egl_surface, gl.egl_surface, gl.egl_context);
|
||||
|
||||
// Common scene state
|
||||
glEnable(GL_BLEND);
|
||||
@@ -286,7 +237,7 @@ int main(int argc, char** argv)
|
||||
glLoadMatrixf(matrix);
|
||||
|
||||
// Draw scene into framebuffer.
|
||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, left_fbo);
|
||||
glBindFramebuffer(GL_FRAMEBUFFER_EXT, left_fbo);
|
||||
glViewport(0, 0, eye_w, eye_h);
|
||||
glClearColor(0.0, 0.0, 0.0, 1.0);
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
@@ -308,7 +259,7 @@ int main(int argc, char** argv)
|
||||
glLoadMatrixf(matrix);
|
||||
|
||||
// Draw scene into framebuffer.
|
||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, right_fbo);
|
||||
glBindFramebuffer(GL_FRAMEBUFFER_EXT, right_fbo);
|
||||
glViewport(0, 0, eye_w, eye_h);
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
draw_scene(list);
|
||||
@@ -320,15 +271,52 @@ int main(int argc, char** argv)
|
||||
}
|
||||
|
||||
// Clean up common draw state
|
||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
|
||||
glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
|
||||
glDisable(GL_BLEND);
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
|
||||
|
||||
// Setup ortho state.
|
||||
glUseProgram(shader);
|
||||
glUniform1f(glGetUniformLocation(shader, "WarpScale"), warp_scale*warp_adj);
|
||||
glUniform4fv(glGetUniformLocation(shader, "HmdWarpParam"), 1, distortion_coeffs);
|
||||
glViewport(0, 0, hmd_w, hmd_h);
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
glColor4d(1, 1, 1, 1);
|
||||
|
||||
// Setup simple render state
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
|
||||
// Draw left eye
|
||||
lvrcSubmitFrameLeft(compositor, left_color_tex);
|
||||
glUniform2fv(glGetUniformLocation(shader, "LensCenter"), 1, left_lens_center);
|
||||
glBindTexture(GL_TEXTURE_2D, left_color_tex);
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2d( 0, 0);
|
||||
glVertex3d( -1, -1, 0);
|
||||
glTexCoord2d( 1, 0);
|
||||
glVertex3d( 0, -1, 0);
|
||||
glTexCoord2d( 1, 1);
|
||||
glVertex3d( 0, 1, 0);
|
||||
glTexCoord2d( 0, 1);
|
||||
glVertex3d( -1, 1, 0);
|
||||
glEnd();
|
||||
|
||||
// Draw right eye
|
||||
lvrcSubmitFrameRight(compositor, right_color_tex);
|
||||
glUniform2fv(glGetUniformLocation(shader, "LensCenter"), 1, right_lens_center);
|
||||
glBindTexture(GL_TEXTURE_2D, right_color_tex);
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2d( 0, 0);
|
||||
glVertex3d( 0, -1, 0);
|
||||
glTexCoord2d( 1, 0);
|
||||
glVertex3d( 1, -1, 0);
|
||||
glTexCoord2d( 1, 1);
|
||||
glVertex3d( 1, 1, 0);
|
||||
glTexCoord2d( 0, 1);
|
||||
glVertex3d( 0, 1, 0);
|
||||
glEnd();
|
||||
|
||||
// Clean up state.
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
@@ -336,17 +324,18 @@ int main(int argc, char** argv)
|
||||
glUseProgram(0);
|
||||
|
||||
// Da swap-dawup!
|
||||
eglSwapBuffers(gl.display, gl.surface);
|
||||
eglSwapBuffers(gl.egl_display, gl.egl_surface);
|
||||
|
||||
|
||||
extern void vr_context_submit_eyes(struct lvrcInstance * compositor);
|
||||
|
||||
vr_context_submit_eyes(compositor);
|
||||
|
||||
lvrcEndFrame(compositor);
|
||||
}
|
||||
|
||||
lvrcReleaseFrameResources(compositor);
|
||||
|
||||
// TODO : destroy OpenGL context here
|
||||
|
||||
lvrcReleaseSwapChain(compositor);
|
||||
|
||||
lvrcDestroyInstance(compositor);
|
||||
|
||||
ohmd_ctx_destroy(ctx);
|
||||
|
||||
Reference in New Issue
Block a user