OpenGL 4.5: glClear() не работает (с использованием SDL2 и GLEW)

Я сделал короткий код, чтобы очистить окно SDL2 с черным цветом с помощью OpenGL 4.5 (GLEW API). Однако это работает только тогда, когда я использую свой набор микросхем Intel (в этом случае следует использовать более старую версию OpenGL). Проблема в том, что если я использую свою Nvidia GTX 960M, окно остается пустым. Может быть, я забыл написать что-то конкретное для OpenGL 4.5? У вас есть какие-нибудь идеи по этому поводу? Вот пример кода:

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

person Ant0nin    schedule 04.07.2016    source источник
comment
Проверьте ошибки, возвращаемые SDL и GL.   -  person Ivan Rubinson    schedule 04.07.2016
comment
glewInit работает на обеих видеокартах?   -  person SurvivalMachine    schedule 04.07.2016
comment
@SurvivalMachine glewInit() возвращает FALSE на карте GTX960M. И он возвращает TRUE на чипсете Intel. Так что ошибка, похоже, здесь. Но я не понимаю, почему... Как вы думаете, мне следует использовать другой API?   -  person Ant0nin    schedule 04.07.2016
comment
Ваш драйвер GTX обновлен? Можете ли вы создать для него более старый контекст OpenGL, например 3.3?   -  person SurvivalMachine    schedule 04.07.2016
comment
Для того, что вы хотите сделать, вам не нужен GLEW. Скорее всего, glewInit не работает, потому что вы изначально не получаете действительный OpenGL. Я думаю, что вы пытаетесь использовать свой графический процессор NVidia с реализацией Mesa OpenGL. Использование OpenGL от нескольких поставщиков раньше было PITA. В конце концов NVidia разработала github.com/NVIDIA/libglvnd, который избавляет от многих проблем при наличии нескольких реализаций OpenGL. установлены рядом. Я настоятельно рекомендую вам установить и использовать его. Может потребоваться некоторая ручная работа, чтобы заставить ваш дистрибутив Linux сотрудничать.   -  person datenwolf    schedule 04.07.2016


Ответы (1)


Я переключил параметр двойного буфера на FALSE, и он работает. Я понял, что если двойной буфер включен, мне нужно сделать несколько «свопов», прежде чем я увижу черный фон окна. Это имеет смысл, но это довольно странно. Кстати, я наконец-то использую GLFW вместо SDL2.

person Ant0nin    schedule 04.07.2016
comment
Наконец-то я использую GLFW вместо SDL2. Имейте в виду, что ему не хватает многих полезных функций по сравнению с SDL. Вы даже не можете максимизировать окно с ним. - person HolyBlackCat; 05.07.2016