gl.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  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. }
  58. void ortho(gl_ctx* ctx)
  59. {
  60. glMatrixMode(GL_PROJECTION);
  61. //glPushMatrix();
  62. glLoadIdentity();
  63. glOrtho(0.0f, ctx->screen->w, ctx->screen->h, 0.0f, -1.0f, 1.0f);
  64. glMatrixMode(GL_MODELVIEW);
  65. //glPushMatrix();
  66. glLoadIdentity();
  67. glDisable(GL_DEPTH_TEST);
  68. glDisable(GL_DEPTH);
  69. glDisable(GL_MULTISAMPLE);
  70. }
  71. void draw_cube()
  72. {
  73. glBegin(GL_QUADS);
  74. glVertex3f( 0.5f, 0.5f, -0.5f); /* Top Right Of The Quad (Top) */
  75. glVertex3f( -0.5f, 0.5f, -0.5f); /* Top Left Of The Quad (Top) */
  76. glVertex3f( -0.5f, 0.5f, 0.5f); /* Bottom Left Of The Quad (Top) */
  77. glVertex3f( 0.5f, 0.5f, 0.5f); /* Bottom Right Of The Quad (Top) */
  78. glVertex3f( 0.5f, -0.5f, 0.5f); /* Top Right Of The Quad (Botm) */
  79. glVertex3f( -0.5f, -0.5f, 0.5f); /* Top Left Of The Quad (Botm) */
  80. glVertex3f( -0.5f, -0.5f, -0.5f); /* Bottom Left Of The Quad (Botm) */
  81. glVertex3f( 0.5f, -0.5f, -0.5f); /* Bottom Right Of The Quad (Botm) */
  82. glVertex3f( 0.5f, 0.5f, 0.5f); /* Top Right Of The Quad (Front) */
  83. glVertex3f( -0.5f, 0.5f, 0.5f); /* Top Left Of The Quad (Front) */
  84. glVertex3f( -0.5f, -0.5f, 0.5f); /* Bottom Left Of The Quad (Front) */
  85. glVertex3f( 0.5f, -0.5f, 0.5f); /* Bottom Right Of The Quad (Front) */
  86. glVertex3f( 0.5f, -0.5f, -0.5f); /* Bottom Left Of The Quad (Back) */
  87. glVertex3f( -0.5f, -0.5f, -0.5f); /* Bottom Right Of The Quad (Back) */
  88. glVertex3f( -0.5f, 0.5f, -0.5f); /* Top Right Of The Quad (Back) */
  89. glVertex3f( 0.5f, 0.5f, -0.5f); /* Top Left Of The Quad (Back) */
  90. glVertex3f( -0.5f, 0.5f, 0.5f); /* Top Right Of The Quad (Left) */
  91. glVertex3f( -0.5f, 0.5f, -0.5f); /* Top Left Of The Quad (Left) */
  92. glVertex3f( -0.5f, -0.5f, -0.5f); /* Bottom Left Of The Quad (Left) */
  93. glVertex3f( -0.5f, -0.5f, 0.5f); /* Bottom Right Of The Quad (Left) */
  94. glVertex3f( 0.5f, 0.5f, -0.5f); /* Top Right Of The Quad (Right) */
  95. glVertex3f( 0.5f, 0.5f, 0.5f); /* Top Left Of The Quad (Right) */
  96. glVertex3f( 0.5f, -0.5f, 0.5f); /* Bottom Left Of The Quad (Right) */
  97. glVertex3f( 0.5f, -0.5f, -0.5f); /* Bottom Right Of The Quad (Right) */
  98. glEnd();
  99. }
  100. static void compile_shader_src(GLuint shader, const char* src)
  101. {
  102. glShaderSource(shader, 1, &src, NULL);
  103. glCompileShader(shader);
  104. GLint status;
  105. GLint length;
  106. char log[4096] = {0};
  107. glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
  108. glGetShaderInfoLog(shader, 4096, &length, log);
  109. if(status == GL_FALSE){
  110. printf("compile failed %s\n", log);
  111. }
  112. }
  113. GLuint compile_shader(const char* vertex, const char* fragment)
  114. {
  115. // Create the handels
  116. GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
  117. GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  118. GLuint programShader = glCreateProgram();
  119. // Attach the shaders to a program handel.
  120. glAttachShader(programShader, vertexShader);
  121. glAttachShader(programShader, fragmentShader);
  122. // Load and compile the Vertex Shader
  123. compile_shader_src(vertexShader, vertex);
  124. // Load and compile the Fragment Shader
  125. compile_shader_src(fragmentShader, fragment);
  126. // The shader objects are not needed any more,
  127. // the programShader is the complete shader to be used.
  128. glDeleteShader(vertexShader);
  129. glDeleteShader(fragmentShader);
  130. glLinkProgram(programShader);
  131. GLint status;
  132. GLint length;
  133. char log[4096] = {0};
  134. glGetProgramiv(programShader, GL_LINK_STATUS, &status);
  135. glGetProgramInfoLog(programShader, 4096, &length, log);
  136. if(status == GL_FALSE){
  137. printf("link failed %s\n", log);
  138. }
  139. return programShader;
  140. }
  141. void create_fbo(int eye_width, int eye_height, GLuint* fbo, GLuint* color_tex, GLuint* depth_tex)
  142. {
  143. glGenTextures(1, color_tex);
  144. glGenTextures(1, depth_tex);
  145. glGenFramebuffers(1, fbo);
  146. glBindTexture(GL_TEXTURE_2D, *color_tex);
  147. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, eye_width, eye_height, 0, GL_RGBA, GL_UNSIGNED_INT, NULL);
  148. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  149. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  150. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  151. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  152. glBindTexture(GL_TEXTURE_2D, *depth_tex);
  153. glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, eye_width, eye_height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
  154. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  155. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  156. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  157. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  158. glBindTexture(GL_TEXTURE_2D, 0);
  159. glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, *fbo);
  160. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, *color_tex, 0);
  161. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, *depth_tex, 0);
  162. GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
  163. if(status != GL_FRAMEBUFFER_COMPLETE_EXT){
  164. printf("failed to create fbo %x\n", status);
  165. }
  166. glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
  167. }