Advertisement
Guest User

OpenGL Test

a guest
May 26th, 2011
457
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.02 KB | None | 0 0
  1. //The headers
  2. #include "SDL.h"
  3. #include "SDL_opengl.h"
  4.  
  5. //Screen attributes
  6. const int SCREEN_WIDTH = 640;
  7. const int SCREEN_HEIGHT = 480;
  8. float time;
  9.  
  10. //Event handler
  11. SDL_Event event;
  12.  
  13. //Scary shit
  14. PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB = NULL;
  15. PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB = NULL;
  16. PFNGLSHADERSOURCEARBPROC glShaderSourceARB = NULL;
  17. PFNGLCOMPILESHADERARBPROC glCompileShaderARB = NULL;
  18. PFNGLATTACHOBJECTARBPROC glAttachObjectARB = NULL;
  19. PFNGLLINKPROGRAMARBPROC glLinkProgramARB = NULL;
  20. PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = NULL;
  21. PFNGLUNIFORM2FARBPROC glUniform2fARB = NULL;
  22. PFNGLUNIFORM1FARBPROC glUniform1fARB = NULL;
  23. PFNGLVERTEXATTRIBPOINTERARBPROC glVertexAttribPointerARB = NULL;
  24. PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB = NULL;
  25. //PFNGLENABLEVERTEXATTRIBARRAYARBPROC glEnableVertexAttribArrayARB = NULL;
  26. //PFNGLDISABLEVERTEXATTRIBARRAYARBPROC glDisableVertexAttribArrayARB = NULL;
  27.  
  28. extern PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB;
  29. extern PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB;
  30. extern PFNGLSHADERSOURCEARBPROC glShaderSourceARB;
  31. extern PFNGLCOMPILESHADERARBPROC glCompileShaderARB;
  32. extern PFNGLATTACHOBJECTARBPROC glAttachObjectARB;
  33. extern PFNGLLINKPROGRAMARBPROC glLinkProgramARB;
  34. extern PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB;
  35. extern PFNGLUNIFORM2FARBPROC glUniform2fARB;
  36. extern PFNGLUNIFORM1FARBPROC glUniform1fARB;
  37. extern PFNGLVERTEXATTRIBPOINTERARBPROC glVertexAttribPointerARB;
  38. extern PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB;
  39. //extern PFNGLENABLEVERTEXATTRIBARRAYARBPROC glEnableVertexAttribArrayARB;
  40. //extern PFNGLDISABLEVERTEXATTRIBARRAYARBPROC glDisableVertexAttribArrayARB;
  41.  
  42. //Shader stuff
  43. GLenum shader_vert = 0;
  44. GLenum shader_frag = 0;
  45. GLenum shader_prog = 0;
  46. //GLenum shader_buff = 0;
  47. GLint uniform_location;
  48. GLint uniform_time;
  49. //GLint buffer;
  50.  
  51. char* shader_vert_source =
  52.     "attribute vec3 position;"
  53.     "void main() {"
  54.     "   gl_Position = vec4(position, 1.0);"
  55.     "}";
  56.  
  57. char* shader_frag_source =
  58.     "uniform float time;"
  59.     "uniform vec2 resolution;"
  60.     "void main(void) {"
  61.     "   vec2 position = -1.0 + 2.0 * gl_FragCoord.xy / resolution.xy;"
  62.     "   float red = abs(sin(position.x * position.y + time / 5.0));"
  63.     "   float green = abs(sin(position.x * position.y + time / 4.0));"
  64.     "   float blue = abs(sin(position.x * position.y + time / 3.0));"
  65.     "   gl_FragColor = vec4(red, green, blue, 1.0);"
  66.     "}";
  67.  
  68. //The timer
  69. class Timer
  70. {
  71.     private:
  72.     //The clock time when the timer started
  73.     int startTicks;
  74.  
  75.     public:
  76.     //Initializes variables
  77.     Timer();
  78.  
  79.     //The various clock actions
  80.     void start();
  81.  
  82.     //Gets the timer's time
  83.     int get_ticks();
  84. };
  85.  
  86. bool init_GL()
  87. {
  88.     //Set clear color
  89.     glClearColor(0, 0, 0, 0);
  90.  
  91.     //Set projection
  92.     glMatrixMode(GL_PROJECTION);
  93.     glLoadIdentity();
  94.     glOrtho(0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, -1, 1);
  95.  
  96.     //Initialize modelview matrix
  97.     glMatrixMode(GL_MODELVIEW);
  98.     glEnable(GL_TEXTURE_2D);
  99.     glLoadIdentity();
  100.  
  101.     //If there was any errors
  102.     if (glGetError() != GL_NO_ERROR)
  103.     {
  104.         return false;
  105.     }
  106.  
  107.     //If everything initialized
  108.     return true;
  109. }
  110.  
  111. bool init()
  112. {
  113.     //Initialize SDL
  114.     if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
  115.     {
  116.         return false;
  117.     }
  118.  
  119.     //Create Window
  120.     if (SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 32, SDL_HWSURFACE | SDL_GL_DOUBLEBUFFER | SDL_OPENGL) == NULL)
  121.     {
  122.         return false;
  123.     }
  124.  
  125.     //Initialize OpenGL
  126.     if (!init_GL())
  127.     {
  128.         return false;
  129.     }
  130.  
  131.     //Set caption
  132.     SDL_WM_SetCaption("OpenGL Test", NULL);
  133.  
  134.     glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC) SDL_GL_GetProcAddress("glCreateProgramObjectARB");
  135.     glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) SDL_GL_GetProcAddress("glCreateShaderObjectARB");
  136.     glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) SDL_GL_GetProcAddress("glShaderSourceARB");
  137.     glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC) SDL_GL_GetProcAddress("glCompileShaderARB");
  138.     glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) SDL_GL_GetProcAddress("glAttachObjectARB");
  139.     glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) SDL_GL_GetProcAddress("glLinkProgramARB");
  140.     glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) SDL_GL_GetProcAddress("glUseProgramObjectARB");
  141.     glUniform2fARB = (PFNGLUNIFORM2FARBPROC) SDL_GL_GetProcAddress("glUniform2fARB");
  142.     glUniform1fARB = (PFNGLUNIFORM1FARBPROC) SDL_GL_GetProcAddress("glUniform1fARB");
  143.     glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC) SDL_GL_GetProcAddress("glVertexAttribPointerARB");
  144.     glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC) SDL_GL_GetProcAddress("glGetUniformLocationARB");
  145.     //glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC) SDL_GL_GetProcAddress("glEnableVertexAttribArrayARB");
  146.     //glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) SDL_GL_GetProcAddress("glDisableVertexAttribArrayARB");
  147.  
  148.     shader_prog = glCreateProgramObjectARB();
  149.     shader_vert = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
  150.     shader_frag = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
  151.     //shader_buff = glCreateShaderObjectARB(GL_PIXEL_PACK_BUFFER_ARB);
  152.  
  153.     int len = 0;
  154.     len = strlen(shader_vert_source);
  155.     glShaderSourceARB(shader_vert, 1, (const GLcharARB**)&shader_vert_source, &len);
  156.     len = strlen(shader_frag_source);
  157.     glShaderSourceARB(shader_frag, 1, (const GLcharARB**)&shader_frag_source, &len);
  158.  
  159.     glCompileShaderARB(shader_vert);
  160.     glCompileShaderARB(shader_frag);
  161.     glAttachObjectARB(shader_prog, shader_vert);
  162.     glAttachObjectARB(shader_prog, shader_frag);
  163.     glLinkProgramARB(shader_prog);
  164.  
  165.     return true;
  166. }
  167.  
  168. Timer::Timer()
  169. {
  170.     //Initialize the variables
  171.     startTicks = 0;
  172. }
  173.  
  174. void Timer::start()
  175. {
  176.     //Get the current clock time
  177.     startTicks = SDL_GetTicks();
  178. }
  179.  
  180. int Timer::get_ticks()
  181. {
  182.     //Return the current time minus the start time
  183.     return SDL_GetTicks() - startTicks;
  184. }
  185.  
  186. int main (int argc, char *argv[])
  187. {
  188.     //Quit flag
  189.     bool quit = false;
  190.  
  191.     //Initialize
  192.     if (!init())
  193.     {
  194.         return 1;
  195.     }
  196.  
  197.     //The frame rate regulator
  198.     Timer fps;
  199.  
  200.     //Wait for user exit
  201.     while (!quit)
  202.     {
  203.         //Start the frame timer
  204.         fps.start();
  205.  
  206.         //While there are events to handle
  207.         while (SDL_PollEvent(&event))
  208.         {
  209.             if (event.type == SDL_QUIT)
  210.             {
  211.                 quit = true;
  212.             }
  213.         }
  214.  
  215.         //Clear the screen
  216.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  217.  
  218.         //Render single quad on the screen
  219.         glLoadIdentity();
  220.         glUseProgramObjectARB(shader_prog);
  221.  
  222.         glUniform1fARB(glGetUniformLocationARB(shader_prog, "time"), time++ / 100);
  223.         glUniform2fARB(glGetUniformLocationARB(shader_prog, "resolution"), (float)SCREEN_WIDTH, (float)SCREEN_HEIGHT);
  224.  
  225.         //glNormalPointer(shader_buff, 0, (char *) buffer);
  226.         //glVertexAttribPointerARB(vertex_position, 2, GL_FLOAT, GL_FALSE, 0, 0);
  227.         //glEnableVertexAttribArrayARB(vertex_position);
  228.         glRects(-1, -1, 1, 1);
  229.         //glDisableVertexAttribArrayARB(vertex_position);
  230.  
  231.         //Update screen
  232.         SDL_GL_SwapBuffers();
  233.  
  234.         //Cap the frame rate
  235.         if (fps.get_ticks() < 1000 / 60)
  236.         {
  237.             SDL_Delay((1000 / 60) - fps.get_ticks());
  238.         }
  239.     }
  240.  
  241.     //Clean up
  242.     SDL_Quit();
  243.  
  244.     return 0;
  245. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement