Advertisement
Guest User

SDLTest1

a guest
Jun 19th, 2012
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.25 KB | None | 0 0
  1. #include "stdio.h"
  2. #include "stdlib.h"
  3.  
  4. #include "GL/glew.h"
  5. #include "SDL.h"
  6.  
  7. const int WIDTH = 640;
  8. const int HEIGHT = 480;
  9. const int SLEEP = 10;
  10.  
  11. SDL_Window* p_Window;
  12. SDL_GLContext p_Context;
  13. bool gl_running;
  14.  
  15. SDL_Event event;
  16.  
  17. GLuint g_shVert;
  18. GLuint g_shFrag;
  19. GLuint g_shProg;
  20.  
  21. GLuint g_vao;
  22. GLuint g_vbo;
  23.  
  24. bool init_context()
  25. {
  26.     if(SDL_Init(SDL_INIT_EVERYTHING) == -1)
  27.     {
  28.         fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError());
  29.         return false;
  30.     }
  31.  
  32.     unsigned int flags = SDL_WINDOW_OPENGL|SDL_WINDOW_SHOWN;
  33.  
  34.     SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
  35.     SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
  36.     SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
  37.     SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
  38.     SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
  39.  
  40.     SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
  41.     SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4);
  42.  
  43.     SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
  44.     SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
  45.  
  46.     p_Window = SDL_CreateWindow("OpenGL 3.2 Test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WIDTH, HEIGHT, flags);
  47.  
  48.     if(!p_Window)
  49.     {
  50.         fprintf(stderr, "Unable to create SDL Window: %s\n", SDL_GetError());
  51.         return false;
  52.     }
  53.  
  54.     p_Context = SDL_GL_CreateContext(p_Window);
  55.  
  56.     if(!p_Context)
  57.     {
  58.         fprintf(stderr, "Could not create OpenGL 3.2 context: %s\n", SDL_GetError());
  59.         return false;
  60.     }
  61.  
  62.     SDL_GL_SetSwapInterval(1);
  63.  
  64.     return true;
  65. }
  66.  
  67. void create_shaders()
  68. {
  69.     char shErr[1024];
  70.     int errlen;
  71.     GLint res;
  72.  
  73.     const char* vert_src =
  74.                         "#version 330\n"
  75.                         "in vec2 position;\n"
  76.                         "void main()\n"
  77.                         "{\n"
  78.                         "   gl_Position = vec4(position.x, position.y, 0.0f, 1.0f);\n"
  79.                         "}";
  80.  
  81.     const char* frag_src =
  82.                         "#version 330\n"
  83.                         "out vec4 out_Col;\n"
  84.                         "void main()\n"
  85.                         "{\n"
  86.                         "   out_Col = vec4(1.0f, 0.25f, 0.75f, 1.0f);\n"
  87.                         "}";
  88.  
  89.     g_shVert = glCreateShader(GL_VERTEX_SHADER);
  90.     g_shFrag = glCreateShader(GL_FRAGMENT_SHADER);
  91.     g_shProg = glCreateProgram();
  92.  
  93.     glShaderSource(g_shVert, 1, &vert_src, NULL);
  94.     glShaderSource(g_shFrag, 1, &frag_src, NULL);
  95.  
  96.     glCompileShader(g_shVert);
  97.     glCompileShader(g_shFrag);
  98.  
  99.     glGetShaderiv(g_shVert, GL_COMPILE_STATUS, &res);
  100.     if(res == GL_FALSE)
  101.     {
  102.         fprintf(stderr, "Failed to compile vertex shader.\n");
  103.         glGetShaderInfoLog(g_shVert, 1024, &errlen, shErr);
  104.         printf("%s\n", shErr);
  105.         return;
  106.     }
  107.  
  108.     glGetShaderiv(g_shFrag, GL_COMPILE_STATUS, &res);
  109.     if(res == GL_FALSE)
  110.     {
  111.         fprintf(stderr, "Failed to compile fragment shader.\n");
  112.         glGetShaderInfoLog(g_shFrag, 1024, &errlen, shErr);
  113.         printf("%s\n", shErr);
  114.         return;
  115.     }
  116.  
  117.     glAttachShader(g_shProg, g_shVert);
  118.     glAttachShader(g_shProg, g_shFrag);
  119.  
  120.     glDeleteShader(g_shVert);
  121.     glDeleteShader(g_shFrag);
  122.  
  123.     glLinkProgram(g_shProg);
  124.     glGetProgramiv(g_shProg, GL_LINK_STATUS, &res);
  125.     if(res == GL_FALSE)
  126.         fprintf(stderr, "Failed to link program.\n");
  127.  
  128.     glUseProgram(g_shProg);
  129. }
  130.  
  131. void create_vao()
  132. {
  133.     const float trian[6] =
  134.         {
  135.             -0.25f, -0.25f,
  136.             0.50f, -0.25f,
  137.             0.50f, 0.50f
  138.         };
  139.  
  140.     glGenVertexArrays(1, &g_vao);
  141.     glBindVertexArray(g_vao);
  142.  
  143.     glGenBuffers(1, &g_vbo);
  144.     glBindBuffer(GL_ARRAY_BUFFER, g_vbo);
  145.     glBufferData(GL_ARRAY_BUFFER, sizeof(float)*6, trian, GL_STATIC_DRAW);
  146.     glVertexAttribPointer((GLuint)0, 2, GL_FLOAT, GL_FALSE, 0, 0);
  147.     glEnableVertexAttribArray(0);
  148. }
  149.  
  150. bool init_opengl()
  151. {
  152.     GLenum err;
  153.     if((err = glewInit()) != GLEW_OK)
  154.     {
  155.         fprintf(stderr, "Could not init GLEW:%s\n", glewGetErrorString(err));
  156.         return false;
  157.     }
  158.  
  159.     create_shaders();
  160.     create_vao();
  161.  
  162.     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  163.     glClearDepth(1.0f);
  164.  
  165.     glViewport(0, 0, WIDTH, HEIGHT);
  166.  
  167.     return true;
  168. }
  169.  
  170. void render()
  171. {
  172.     glDrawArrays(GL_TRIANGLES, 0, 3);
  173. }
  174.  
  175. void check_events()
  176. {
  177.     while(SDL_PollEvent(&event))
  178.     {
  179.         switch(event.type)
  180.         {
  181.             case SDL_KEYDOWN:
  182.                                 if((SDLK_ESCAPE) == (event.key.keysym.sym))
  183.                                     gl_running = false;
  184.                                 break;
  185.             case SDL_QUIT:
  186.                                     gl_running = false;
  187.                                 break;
  188.         }
  189.     }
  190. }
  191.  
  192. void run()
  193. {
  194.     gl_running = true;
  195.     while(gl_running == true)
  196.     {
  197.         check_events();
  198.  
  199.         render();
  200.  
  201.         SDL_GL_SwapWindow(p_Window);
  202.  
  203.         SDL_Delay(SLEEP);
  204.     }
  205. }
  206.  
  207.  
  208.  
  209. void release()
  210. {
  211.     SDL_GL_DeleteContext(p_Context);
  212.     SDL_DestroyWindow(p_Window);
  213.     SDL_Quit();
  214. }
  215.  
  216. int main(int argc, char* argv[])
  217. {
  218.     if(init_context() == false)
  219.         return 1;
  220.  
  221.     if(init_opengl() == false)
  222.     {
  223.         release();
  224.         return 1;
  225.     }
  226.  
  227.     run();
  228.  
  229.     release();
  230.  
  231.     return 0;
  232. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement