SDL2 OpenGL3 How to initialize SDL inside a function

I am experimenting with the new beta version of SDL2 and the OpenGL3 context, and I have a strange problem:

If I run the SDL initialization code in my main () function, it works fine, but I want this code to be executed in the separete init_sdl () function.

If I put the initialization code in a separate init_sdl () function and call this function from main (), the background color will never be drawn, and the program will start to absorb all my system resources insanely.

Can someone point me to a working example where the SDL is initialized in a separate function? It seems I can’t find ... Maybe this is impossible? I think I vaguely remember that I had a similar problem with SDL 1.2, but several years have passed since I used this, and I don’t think I have ever found a solution. In fact, this may be the reason I decided to switch to using SFML.

I really want to use SDL2 instead of SFML, because it works on other platforms, but the inability to split things up into small functions is an interruption for me. It should be easy. Am I missing something obvious?

Edit:

It works:

#include <iostream> #include <GL/glew.h> #include <SDL.h> #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 << "GLEW Error: " << glewGetErrorString(status) << "\n"; exit(1); } // sync buffer swap with monitor 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(&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; } 

This does not work:

 #include <iostream> #include <GL/glew.h> #include <SDL.h> #define PROGRAM_NAME "SDL2 OpenGL3 Example" void init_sdl(SDL_Window* sdl2_window, 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); } 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 << "GLEW Error: " << glewGetErrorString(status) << "\n"; exit(1); } // sync buffer swap with monitor 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(&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; } 
+7
source share
2 answers
 void init_sdl(SDL_Window* sdl2_window, SDL_GLContext& opengl3_context) 

Your first argument should be a link. Otherwise, when you return to main() sdl2_window , it is still zero.

+3
source

Are you sure the context is not to blame:

 int flags = SDL_WINDOW_OPENGL | SDL_WINDOW_BORDERLESS | SDL_WINDOW_SHOWN; win = SDL_CreateWindow("3Doodle", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1024, 768, flags); SDL_assert(win != NULL); context = SDL_GL_CreateContext(win); SDL_assert(context != NULL); 
0
source

All Articles