Note that there are some explanatory texts on larger screens.

plurals
  1. POSDL2 OpenGL3 How to initialize SDL inside a function
    primarykey
    data
    text
    <p>I'm experimenting with the new SDL2 beta and an OpenGL3 context, and I'm having a weird problem:</p> <p>If I run the SDL initialization code in my main() function, it works fine, but I want to have this code in a separete init_sdl() function.</p> <p>If I put the initialization code in a separate init_sdl() function, and call this function from main(), the background color is never drawn, and the program starts to madly consume all my system's resources.</p> <p>Could someone point me to a working example where SDL is initialized in a separate function? I can't seem to find one... Maybe this is not possible? I think I vaguely remember having a similar problem with SDL 1.2, but it's been a few years since I've used that, and I don't think I ever found a solution. In fact, this may be the reason I chose to switch to using SFML instead.</p> <p>I really want to use SDL2 instead of SFML because it runs on more platforms, but not being able to separate things out into small functions is a deal breaker for me. This should be easy, am I missing something obvious?</p> <p><strong>Edit:</strong></p> <p>This works:</p> <pre><code>#include &lt;iostream&gt; #include &lt;GL/glew.h&gt; #include &lt;SDL.h&gt; #define PROGRAM_NAME "SDL2 OpenGL3 Example" int main(int argc, char** argv) { SDL_Window* sdl2_window = 0; SDL_GLContext opengl3_context; SDL_Init(SDL_INIT_VIDEO); // set the opengl context version SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); // turn on double buffering set the depth buffer to 24 bits // you may need to change this to 16 or 32 for your system SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); // create the sdl2 window sdl2_window = SDL_CreateWindow(PROGRAM_NAME, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 512, 512, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN); // create the opengl3 context opengl3_context = SDL_GL_CreateContext(sdl2_window); GLenum status = glewInit(); if (status != GLEW_OK) { std::cerr &lt;&lt; "GLEW Error: " &lt;&lt; glewGetErrorString(status) &lt;&lt; "\n"; exit(1); } // sync buffer swap with monitor's vertical refresh rate SDL_GL_SetSwapInterval(1); // set background color glClearColor( 1.0, 0.0, 0.0, 1.0 ); while (true) { int status = 0; glClear( GL_COLOR_BUFFER_BIT ); SDL_GL_SwapWindow(sdl2_window); SDL_Event event; while (SDL_PollEvent(&amp;event)) { switch (event.type) { case SDL_KEYDOWN: break; case SDL_KEYUP: // if escape is pressed, quit if (event.key.keysym.sym == SDLK_ESCAPE) status = 1; // set status to 1 to exit main loop break; case SDL_QUIT: status = 1; break; } } if (status == 1) // if received instruction to quit break; } // delete opengl3 context, destroy sdl2 window, and shut down sdl subsystems SDL_GL_DeleteContext(opengl3_context); SDL_DestroyWindow(sdl2_window); SDL_Quit(); return 0; } </code></pre> <p>This doesn't work:</p> <pre><code>#include &lt;iostream&gt; #include &lt;GL/glew.h&gt; #include &lt;SDL.h&gt; #define PROGRAM_NAME "SDL2 OpenGL3 Example" void init_sdl(SDL_Window* sdl2_window, SDL_GLContext&amp; opengl3_context) { SDL_Init(SDL_INIT_VIDEO); // set the opengl context version SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); // turn on double buffering set the depth buffer to 24 bits // you may need to change this to 16 or 32 for your system SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); // create the sdl2 window sdl2_window = SDL_CreateWindow(PROGRAM_NAME, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 512, 512, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN); // create the opengl3 context opengl3_context = SDL_GL_CreateContext(sdl2_window); } int main(int argc, char** argv) { SDL_Window* sdl2_window = 0; SDL_GLContext opengl3_context; init_sdl(sdl2_window, opengl3_context); GLenum status = glewInit(); if (status != GLEW_OK) { std::cerr &lt;&lt; "GLEW Error: " &lt;&lt; glewGetErrorString(status) &lt;&lt; "\n"; exit(1); } // sync buffer swap with monitor's vertical refresh rate SDL_GL_SetSwapInterval(1); // set background color glClearColor( 1.0, 0.0, 0.0, 1.0 ); while (true) { int status = 0; glClear( GL_COLOR_BUFFER_BIT ); SDL_GL_SwapWindow(sdl2_window); SDL_Event event; while (SDL_PollEvent(&amp;event)) { switch (event.type) { case SDL_KEYDOWN: break; case SDL_KEYUP: // if escape is pressed, quit if (event.key.keysym.sym == SDLK_ESCAPE) status = 1; // set status to 1 to exit main loop break; case SDL_QUIT: status = 1; break; } } if (status == 1) // if received instruction to quit break; } // delete opengl3 context, destroy sdl2 window, and shut down sdl subsystems SDL_GL_DeleteContext(opengl3_context); SDL_DestroyWindow(sdl2_window); SDL_Quit(); return 0; } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload