gl.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  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. SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 1);
  28. ctx->screen = SDL_SetVideoMode(w, h, 0, SDL_OPENGL | SDL_GL_DOUBLEBUFFER);
  29. if(ctx->screen == NULL){
  30. printf("SDL_SetVideoMode failed\n");
  31. exit(-1);
  32. }
  33. // Disable ctrl-c catching on linux (and OS X?)
  34. #ifdef __unix
  35. signal(SIGINT, SIG_DFL);
  36. #endif
  37. // Load extensions.
  38. glewInit();
  39. printf("OpenGL Renderer: %s\n", glGetString(GL_RENDERER));
  40. printf("OpenGL Vendor: %s\n", glGetString(GL_VENDOR));
  41. printf("OpenGL Version: %s\n", glGetString(GL_VERSION));
  42. // == Initialize OpenGL ==
  43. glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
  44. glClear(GL_COLOR_BUFFER_BIT);
  45. glEnable(GL_BLEND);
  46. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  47. glEnable(GL_ALPHA_TEST);
  48. glLoadIdentity();
  49. glShadeModel(GL_SMOOTH);
  50. glDisable(GL_DEPTH_TEST);
  51. glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  52. glLoadIdentity();
  53. glMatrixMode(GL_PROJECTION);
  54. glEnable(GL_POLYGON_SMOOTH);
  55. glLoadIdentity();
  56. glViewport(0, 0, ctx->screen->w, ctx->screen->h);
  57. perspective(ctx);
  58. }
  59. void ortho(gl_ctx* ctx)
  60. {
  61. glMatrixMode(GL_PROJECTION);
  62. //glPushMatrix();
  63. glLoadIdentity();
  64. glOrtho(0.0f, ctx->screen->w, ctx->screen->h, 0.0f, -1.0f, 1.0f);
  65. glMatrixMode(GL_MODELVIEW);
  66. //glPushMatrix();
  67. glLoadIdentity();
  68. glDisable(GL_DEPTH_TEST);
  69. glDisable(GL_DEPTH);
  70. glDisable(GL_MULTISAMPLE);
  71. }
  72. void calculate_frustum(double fovy, double aspect, double znear, double zfar)
  73. {
  74. float fh = tan(fovy / 360 * M_PI) * znear;
  75. float fw = fh * aspect;
  76. glFrustum(-fw, fw, -fh, fh, znear, zfar);
  77. }
  78. void perspective(gl_ctx* ctx)
  79. {
  80. glViewport(0, 0, ctx->screen->w, ctx->screen->h);
  81. glMatrixMode(GL_PROJECTION);
  82. glLoadIdentity();
  83. calculate_frustum(90, ctx->screen->w / ctx->screen->h, .1, 5000);
  84. glMatrixMode(GL_MODELVIEW);
  85. glLoadIdentity();
  86. glEnable(GL_DEPTH);
  87. glEnable(GL_MULTISAMPLE_ARB);
  88. glDepthFunc(GL_LEQUAL);
  89. glEnable(GL_DEPTH_TEST);
  90. }
  91. void draw_cube()
  92. {
  93. glBegin(GL_QUADS);
  94. glVertex3f( 0.5f, 0.5f, -0.5f); /* Top Right Of The Quad (Top) */
  95. glVertex3f( -0.5f, 0.5f, -0.5f); /* Top Left Of The Quad (Top) */
  96. glVertex3f( -0.5f, 0.5f, 0.5f); /* Bottom Left Of The Quad (Top) */
  97. glVertex3f( 0.5f, 0.5f, 0.5f); /* Bottom Right Of The Quad (Top) */
  98. glVertex3f( 0.5f, -0.5f, 0.5f); /* Top Right Of The Quad (Botm) */
  99. glVertex3f( -0.5f, -0.5f, 0.5f); /* Top Left Of The Quad (Botm) */
  100. glVertex3f( -0.5f, -0.5f, -0.5f); /* Bottom Left Of The Quad (Botm) */
  101. glVertex3f( 0.5f, -0.5f, -0.5f); /* Bottom Right Of The Quad (Botm) */
  102. glVertex3f( 0.5f, 0.5f, 0.5f); /* Top Right Of The Quad (Front) */
  103. glVertex3f( -0.5f, 0.5f, 0.5f); /* Top Left Of The Quad (Front) */
  104. glVertex3f( -0.5f, -0.5f, 0.5f); /* Bottom Left Of The Quad (Front) */
  105. glVertex3f( 0.5f, -0.5f, 0.5f); /* Bottom Right Of The Quad (Front) */
  106. glVertex3f( 0.5f, -0.5f, -0.5f); /* Bottom Left Of The Quad (Back) */
  107. glVertex3f( -0.5f, -0.5f, -0.5f); /* Bottom Right Of The Quad (Back) */
  108. glVertex3f( -0.5f, 0.5f, -0.5f); /* Top Right Of The Quad (Back) */
  109. glVertex3f( 0.5f, 0.5f, -0.5f); /* Top Left Of The Quad (Back) */
  110. glVertex3f( -0.5f, 0.5f, 0.5f); /* Top Right Of The Quad (Left) */
  111. glVertex3f( -0.5f, 0.5f, -0.5f); /* Top Left Of The Quad (Left) */
  112. glVertex3f( -0.5f, -0.5f, -0.5f); /* Bottom Left Of The Quad (Left) */
  113. glVertex3f( -0.5f, -0.5f, 0.5f); /* Bottom Right Of The Quad (Left) */
  114. glVertex3f( 0.5f, 0.5f, -0.5f); /* Top Right Of The Quad (Right) */
  115. glVertex3f( 0.5f, 0.5f, 0.5f); /* Top Left Of The Quad (Right) */
  116. glVertex3f( 0.5f, -0.5f, 0.5f); /* Bottom Left Of The Quad (Right) */
  117. glVertex3f( 0.5f, -0.5f, -0.5f); /* Bottom Right Of The Quad (Right) */
  118. glEnd();
  119. }
  120. static void compile_shader_src(GLuint shader, const char* src)
  121. {
  122. glShaderSource(shader, 1, &src, NULL);
  123. glCompileShader(shader);
  124. GLint status;
  125. GLint length;
  126. char log[4096] = {0};
  127. glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
  128. glGetShaderInfoLog(shader, 4096, &length, log);
  129. if(status == GL_FALSE){
  130. printf("compile failed %s\n", log);
  131. }
  132. }
  133. GLuint compile_shader(const char* vertex, const char* fragment)
  134. {
  135. // Create the handels
  136. GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
  137. GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  138. GLuint programShader = glCreateProgram();
  139. // Attach the shaders to a program handel.
  140. glAttachShader(programShader, vertexShader);
  141. glAttachShader(programShader, fragmentShader);
  142. // Load and compile the Vertex Shader
  143. compile_shader_src(vertexShader, vertex);
  144. // Load and compile the Fragment Shader
  145. compile_shader_src(fragmentShader, fragment);
  146. // The shader objects are not needed any more,
  147. // the programShader is the complete shader to be used.
  148. glDeleteShader(vertexShader);
  149. glDeleteShader(fragmentShader);
  150. glLinkProgram(programShader);
  151. GLint status;
  152. GLint length;
  153. char log[4096] = {0};
  154. glGetProgramiv(programShader, GL_LINK_STATUS, &status);
  155. glGetProgramInfoLog(programShader, 4096, &length, log);
  156. if(status == GL_FALSE){
  157. printf("link failed %s\n", log);
  158. }
  159. return programShader;
  160. }
  161. void create_fbo(int eye_width, int eye_height, GLuint* fbo, GLuint* color_tex, GLuint* depth_tex)
  162. {
  163. glGenTextures(1, color_tex);
  164. glGenTextures(1, depth_tex);
  165. glGenFramebuffers(1, fbo);
  166. glBindTexture(GL_TEXTURE_2D, *color_tex);
  167. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, eye_width, eye_height, 0, GL_RGBA, GL_UNSIGNED_INT, NULL);
  168. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  169. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  170. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  171. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  172. glBindTexture(GL_TEXTURE_2D, *depth_tex);
  173. glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, eye_width, eye_height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
  174. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  175. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  176. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  177. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  178. glBindTexture(GL_TEXTURE_2D, 0);
  179. glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, *fbo);
  180. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, *color_tex, 0);
  181. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, *depth_tex, 0);
  182. GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
  183. if(status != GL_FRAMEBUFFER_COMPLETE_EXT){
  184. printf("failed to create fbo %x\n", status);
  185. }
  186. glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
  187. }