gl.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. /*
  2. * OpenHMD - Free and Open Source API and drivers for immersive technology.
  3. * Copyright (C) 2013 Fredrik Hultin.
  4. * Copyright (C) 2013 Jakob Bornecrantz.
  5. * Distributed under the Boost 1.0 licence, see LICENSE for full text.
  6. */
  7. /* OpenGL Test - GL Helper Functions Implementation */
  8. #include "gl.h"
  9. #include <string.h>
  10. #include <math.h>
  11. #ifdef __unix
  12. #include <signal.h>
  13. #endif
  14. #ifndef M_PI
  15. #define M_PI 3.14159265359
  16. #endif
  17. void init_gl(gl_ctx* ctx, int w, int h)
  18. {
  19. memset(ctx, 0, sizeof(gl_ctx));
  20. // == Initialize SDL ==
  21. int ret = SDL_Init(SDL_INIT_EVERYTHING);
  22. if(ret < 0){
  23. printf("SDL_Init failed\n");
  24. exit(-1);
  25. }
  26. SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
  27. ctx->window = SDL_CreateWindow("OpenHMD opengl example",
  28. SDL_WINDOWPOS_UNDEFINED,
  29. SDL_WINDOWPOS_UNDEFINED,
  30. w, h, SDL_WINDOW_OPENGL );
  31. if(ctx->window == NULL) {
  32. printf("SDL_CreateWindow failed\n");
  33. exit(-1);
  34. }
  35. ctx->w = w;
  36. ctx->h = h;
  37. ctx->is_fullscreen = 0;
  38. ctx->glcontext = SDL_GL_CreateContext(ctx->window);
  39. if(ctx->glcontext == NULL){
  40. printf("SDL_GL_CreateContext\n");
  41. exit(-1);
  42. }
  43. SDL_GL_SetSwapInterval(1);
  44. // Disable ctrl-c catching on Linux (and OS X?)
  45. #ifdef __unix
  46. signal(SIGINT, SIG_DFL);
  47. #endif
  48. // Load extensions.
  49. glewInit();
  50. printf("OpenGL Renderer: %s\n", glGetString(GL_RENDERER));
  51. printf("OpenGL Vendor: %s\n", glGetString(GL_VENDOR));
  52. printf("OpenGL Version: %s\n", glGetString(GL_VERSION));
  53. // == Initialize OpenGL ==
  54. glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
  55. glClear(GL_COLOR_BUFFER_BIT);
  56. glEnable(GL_BLEND);
  57. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  58. glEnable(GL_ALPHA_TEST);
  59. glLoadIdentity();
  60. glShadeModel(GL_SMOOTH);
  61. glDisable(GL_DEPTH_TEST);
  62. glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  63. glLoadIdentity();
  64. glMatrixMode(GL_PROJECTION);
  65. glEnable(GL_POLYGON_SMOOTH);
  66. glLoadIdentity();
  67. glViewport(0, 0, ctx->w, ctx->h);
  68. }
  69. void ortho(gl_ctx* ctx)
  70. {
  71. glMatrixMode(GL_PROJECTION);
  72. //glPushMatrix();
  73. glLoadIdentity();
  74. glOrtho(0.0f, ctx->w, ctx->h, 0.0f, -1.0f, 1.0f);
  75. glMatrixMode(GL_MODELVIEW);
  76. //glPushMatrix();
  77. glLoadIdentity();
  78. glDisable(GL_DEPTH_TEST);
  79. glDisable(GL_DEPTH);
  80. glDisable(GL_MULTISAMPLE);
  81. }
  82. void draw_cube()
  83. {
  84. glBegin(GL_QUADS);
  85. glVertex3f( 0.5f, 0.5f, -0.5f); /* Top Right Of The Quad (Top) */
  86. glVertex3f( -0.5f, 0.5f, -0.5f); /* Top Left Of The Quad (Top) */
  87. glVertex3f( -0.5f, 0.5f, 0.5f); /* Bottom Left Of The Quad (Top) */
  88. glVertex3f( 0.5f, 0.5f, 0.5f); /* Bottom Right Of The Quad (Top) */
  89. glVertex3f( 0.5f, -0.5f, 0.5f); /* Top Right Of The Quad (Botm) */
  90. glVertex3f( -0.5f, -0.5f, 0.5f); /* Top Left Of The Quad (Botm) */
  91. glVertex3f( -0.5f, -0.5f, -0.5f); /* Bottom Left Of The Quad (Botm) */
  92. glVertex3f( 0.5f, -0.5f, -0.5f); /* Bottom Right Of The Quad (Botm) */
  93. glVertex3f( 0.5f, 0.5f, 0.5f); /* Top Right Of The Quad (Front) */
  94. glVertex3f( -0.5f, 0.5f, 0.5f); /* Top Left Of The Quad (Front) */
  95. glVertex3f( -0.5f, -0.5f, 0.5f); /* Bottom Left Of The Quad (Front) */
  96. glVertex3f( 0.5f, -0.5f, 0.5f); /* Bottom Right Of The Quad (Front) */
  97. glVertex3f( 0.5f, -0.5f, -0.5f); /* Bottom Left Of The Quad (Back) */
  98. glVertex3f( -0.5f, -0.5f, -0.5f); /* Bottom Right Of The Quad (Back) */
  99. glVertex3f( -0.5f, 0.5f, -0.5f); /* Top Right Of The Quad (Back) */
  100. glVertex3f( 0.5f, 0.5f, -0.5f); /* Top Left Of The Quad (Back) */
  101. glVertex3f( -0.5f, 0.5f, 0.5f); /* Top Right Of The Quad (Left) */
  102. glVertex3f( -0.5f, 0.5f, -0.5f); /* Top Left Of The Quad (Left) */
  103. glVertex3f( -0.5f, -0.5f, -0.5f); /* Bottom Left Of The Quad (Left) */
  104. glVertex3f( -0.5f, -0.5f, 0.5f); /* Bottom Right Of The Quad (Left) */
  105. glVertex3f( 0.5f, 0.5f, -0.5f); /* Top Right Of The Quad (Right) */
  106. glVertex3f( 0.5f, 0.5f, 0.5f); /* Top Left Of The Quad (Right) */
  107. glVertex3f( 0.5f, -0.5f, 0.5f); /* Bottom Left Of The Quad (Right) */
  108. glVertex3f( 0.5f, -0.5f, -0.5f); /* Bottom Right Of The Quad (Right) */
  109. glEnd();
  110. }
  111. static void compile_shader_src(GLuint shader, const char* src)
  112. {
  113. glShaderSource(shader, 1, &src, NULL);
  114. glCompileShader(shader);
  115. GLint status;
  116. GLint length;
  117. char log[4096] = {0};
  118. glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
  119. glGetShaderInfoLog(shader, 4096, &length, log);
  120. if(status == GL_FALSE){
  121. printf("compile failed %s\n", log);
  122. }
  123. }
  124. GLuint compile_shader(const char* vertex, const char* fragment)
  125. {
  126. // Create the handels
  127. GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
  128. GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  129. GLuint programShader = glCreateProgram();
  130. // Attach the shaders to a program handel.
  131. glAttachShader(programShader, vertexShader);
  132. glAttachShader(programShader, fragmentShader);
  133. // Load and compile the Vertex Shader
  134. compile_shader_src(vertexShader, vertex);
  135. // Load and compile the Fragment Shader
  136. compile_shader_src(fragmentShader, fragment);
  137. // The shader objects are not needed any more,
  138. // the programShader is the complete shader to be used.
  139. glDeleteShader(vertexShader);
  140. glDeleteShader(fragmentShader);
  141. glLinkProgram(programShader);
  142. GLint status;
  143. GLint length;
  144. char log[4096] = {0};
  145. glGetProgramiv(programShader, GL_LINK_STATUS, &status);
  146. glGetProgramInfoLog(programShader, 4096, &length, log);
  147. if(status == GL_FALSE){
  148. printf("link failed %s\n", log);
  149. }
  150. return programShader;
  151. }
  152. void create_fbo(int eye_width, int eye_height, GLuint* fbo, GLuint* color_tex, GLuint* depth_tex)
  153. {
  154. glGenTextures(1, color_tex);
  155. glGenTextures(1, depth_tex);
  156. glGenFramebuffers(1, fbo);
  157. glBindTexture(GL_TEXTURE_2D, *color_tex);
  158. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, eye_width, eye_height, 0, GL_RGBA, GL_UNSIGNED_INT, NULL);
  159. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  160. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  161. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  162. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  163. glBindTexture(GL_TEXTURE_2D, *depth_tex);
  164. glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, eye_width, eye_height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
  165. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  166. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  167. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  168. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  169. glBindTexture(GL_TEXTURE_2D, 0);
  170. glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, *fbo);
  171. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, *color_tex, 0);
  172. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, *depth_tex, 0);
  173. GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
  174. if(status != GL_FRAMEBUFFER_COMPLETE_EXT){
  175. printf("failed to create fbo %x\n", status);
  176. }
  177. glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
  178. }