2012-12-11 36 views
7

मैं नए SDL2 बीटा और एक OpenGL3 संदर्भ के साथ प्रयोग कर रहा हूँ अंदर एसडीएल प्रारंभ करने में कैसे है, और मैं एक अजीब समस्या आ रही है:SDL2 OpenGL3 एक समारोह

अगर मैं अपने मुख्य में एसडीएल प्रवर्तन कोड चलाने () फ़ंक्शन, यह ठीक काम करता है, लेकिन मैं इस कोड को separete init_sdl() फ़ंक्शन में रखना चाहता हूं।

यदि मैं प्रारंभिक कोड को एक अलग init_sdl() फ़ंक्शन में डालता हूं, और इस फ़ंक्शन को मुख्य() से कॉल करता हूं, तो पृष्ठभूमि रंग कभी नहीं खींचा जाता है, और प्रोग्राम पागलपन से मेरे सभी सिस्टम के संसाधनों का उपभोग शुरू करता है।

क्या कोई मुझे एक कामकाजी उदाहरण में इंगित कर सकता है जहां एसडीएल एक अलग समारोह में शुरू किया गया है? मैं एक नहीं ढूंढ सकता ... शायद यह संभव नहीं है? मुझे लगता है कि मुझे एसडीएल 1.2 के साथ एक ही समस्या होने की अस्पष्टता याद है, लेकिन मैंने इसका उपयोग करने के कुछ सालों बाद किया है, और मुझे नहीं लगता कि मुझे कभी समाधान मिला है। असल में, यही कारण है कि मैंने इसके बजाय एसएफएमएल का उपयोग करने के लिए स्विच करना चुना।

मैं वास्तव में एसएफएमएल के बजाय एसडीएल 2 का उपयोग करना चाहता हूं क्योंकि यह अधिक प्लेटफ़ॉर्म पर चलता है, लेकिन छोटे कार्यों में चीजों को अलग करने में सक्षम नहीं होने के कारण मेरे लिए एक सौदा ब्रेकर है। यह आसान होना चाहिए, क्या मुझे कुछ याद आ रही है?

संपादित करें:

यह काम करता है:

#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'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(&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; 
} 

यह काम नहीं करता:

#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'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(&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; 
} 
+1

[SSCCE] (http://sscce.org/) समय। – genpfault

+0

मैंने कोड उदाहरण – Defcronyke

उत्तर

3
void init_sdl(SDL_Window* sdl2_window, SDL_GLContext& opengl3_context) 

आपका पहला तर्क एक संदर्भ भी होना चाहिए। अन्यथा जब आप main()sdl2_window पर वापस आते हैं तो अभी भी शून्य है।

+0

जोड़ा धन्यवाद! तो एक सूचक संदर्भ, आह? मुझे नहीं पता था कि एक सूचक और सूचक सूचक के बीच एक अंतर था। – Defcronyke

+0

कोई समस्या नहीं! यही कारण है कि मुझे एसएससीसीईएस पसंद है :) – genpfault

+1

@Defcronyke, जब आप मान द्वारा एक चर (फ़ंक्शन में) भेजते हैं, तो आप इसकी सामग्री कॉपी करते हैं और फ़ंक्शंस में उस चर को बदलने का कोई तरीका नहीं होगा। यदि वह चर एक सूचक होता है, तो यह वही बात है। आप पॉइंटर "बाय-वैल्यू" पास कर रहे हैं जिसका अर्थ है 'init_sdl' में एक पता है (जो इसे बदल सकता है जहां यह इंगित करता है), लेकिन उस पते को मूल चर बदल नहीं सकता है। यही कारण है कि आपको संदर्भ द्वारा इसे भेजने की आवश्यकता है, ताकि आप सूचक को बदल सकें। – Shahbaz

0

हैं क्या आप वाकई संदर्भ गलती नहीं है:

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);