2016-07-04 20 views
2

Ich habe einen kurzen Code erstellt, um ein SDL2-Fenster mit schwarzer Farbe mit OpenGL 4.5 (GLEW API) zu löschen. Allerdings funktioniert es nur, wenn ich meinen Intel-Chipsatz verwende (in diesem Fall sollte eine ältere OpenGL-Version verwendet werden). Das Problem ist, dass wenn ich meine Nvidia GTX 960M benutze, das Fenster immer noch leer ist. Vielleicht habe ich vergessen, etwas zu schreiben, das spezifisch für OpenGL 4.5 ist? Hast du eine Ahnung davon? Hier ist das Codebeispiel:OpenGL 4.5: GlClear() funktioniert nicht (mit SDL2 und GLEW)

DisplayContext::DisplayContext(PropertiesDictionary properties) 
{ 
    const string windowTitle = properties.getString("window_title"); 
    const int screenX = properties.getNumber("screen_resolution_x"); 
    const int screenY = properties.getNumber("screen_resolution_y"); 
    const bool isFullscreen = properties.getBoolean("fullscreen"); 

    const int gl_majorVersion = properties.getNumber("gl_major_version"); 
    const int gl_minorVersion = properties.getNumber("gl_minor_version"); 
    const int doublebuffer = properties.getNumber("gl_doublebuffer"); 
    const int depthSize = properties.getNumber("gl_depth_size"); 
    const bool isGlewExperimental = properties.getBoolean("glew_experimental"); 

    SDL_Init(SDL_INIT_VIDEO); 
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, gl_majorVersion); // 4 
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, gl_minorVersion); // 5 
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, doublebuffer); // TRUE 
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, depthSize); // 24 

    window = SDL_CreateWindow(
     windowTitle.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, screenX, screenY, 
     SDL_WINDOW_OPENGL | (isFullscreen ? SDL_WINDOW_FULLSCREEN : NULL)); 

    context = SDL_GL_CreateContext(window); 
    glewExperimental = isGlewExperimental ? GL_TRUE : GL_FALSE; // TRUE 
    glewInit(); 

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    SDL_GL_SwapWindow(window); 
} 
+0

Auf Fehler überprüfen, die von SDL und GL zurückgegeben werden. –

+0

Gelingt 'glewInit' auf beiden Grafikkarten? – SurvivalMachine

+0

@ SurvivalMachine glewInit() gibt auf der GTX960M-Karte FALSE zurück. Und es liefert TRUE auf Intel-Chipsatz. Also scheint der Fehler hier zu sein. Aber ich verstehe nicht warum ... Denkst du, ich sollte eine andere API verwenden? – Ant0nin

Antwort

3

Ich schaltete die Doublebuffer-Option auf FALSE und es funktioniert. Ich erkannte, dass, wenn Doppelbuffer eingeschaltet ist, ich mehrere "swap" tun muss, bevor ich einen schwarzen Fensterhintergrund sehe. Es macht Sinn, aber es ist ziemlich seltsam. Übrigens benutze ich GLFW anstelle von SDL2.

+1

* "Ich benutze endlich GLFW anstelle von SDL2" * - Beachten Sie, dass es * viele * nützliche Funktionen im Vergleich zu SDL fehlt. Sie können nicht einmal ein Fenster damit maximieren. – HolyBlackCat