GLSL-шейдер версии 4.30 не поддерживается - PullRequest
0 голосов
/ 30 июня 2018

В моем ноутбуке установлена ​​видеокарта Intel HD4400. Когда я запускаю glxinfo | grep "OpenGL", я получаю

OpenGL vendor string: Intel Open Source Technology Center
OpenGL renderer string: Mesa DRI Intel(R) Haswell Mobile 
OpenGL core profile version string: 4.5 (Core Profile) Mesa 18.0.0-rc5
OpenGL core profile shading language version string: 4.50
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 3.0 Mesa 18.0.0-rc5
OpenGL shading language version string: 1.30
OpenGL context flags: (none)
OpenGL extensions:
OpenGL ES profile version string: OpenGL ES 3.1 Mesa 18.0.0-rc5
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.10
OpenGL ES profile extensions:

Это должно означать, что моя видеокарта может поддерживать GLSL версии 4.30, верно? Тем не менее, моя шейдерная компиляция завершается со следующим сообщением

error: GLSL 4.30 is not supported. Supported versions are: 1.10, 1.20, 1.30, 1.00 ES, 3.00 ES, and 3.10 ES

В моем коде я устанавливаю профиль контекста на ядро ​​со следующим утверждением

SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE)

, после чего я установил для контекста мажорную и минорную версии соответственно 4 и 3.

Есть идеи? Я на Ubuntu 18.04. Я подумал, что это могут быть графические драйверы, которые не обновлены, но если они не обновлены, то glxinfo все равно скажет мне, что версия 4.50 поддерживается? Также кажется, что в Ubuntu уже установлены последние графические драйверы Intel, и я не хочу рисковать установкой графических драйверов, которые могут сломать мой дисплей.

Дополнительная информация:

Я запустил этот точный код на другой машине , и он работал отлично (и я совершенно уверен, что эта машина не поддерживает GL 4.3-совместимый). Поэтому я не верю, что так я создал свой контекст. Вот код, в котором я установил контекстную версию своего профиля:

void set_gl_attribs()
{   
    if (SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE))
    {
        cout << "Could not set core profile" << endl;
    }
    if (SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4))
    {
        cout << "Could not set GL major version" << endl;
    }
    if (SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3))
    {
        cout << "Could not set GL minor version" << endl;
    }
}

И это , где Я вызываю код ( до Я вызываю любые другие функции SDL или OpenGL):

SDL_Init(SDL_INIT_EVERYTHING);

window = SDL_CreateWindow("Sphere", 100, 100, width, height, SDL_WINDOW_OPENGL);
gl_context = SDL_GL_CreateContext(window);
//SDL_HideWindow(window);

set_gl_attribs();  // where I set the context, as shown above
SDL_GL_SetSwapInterval(1);

glewExperimental = GL_TRUE;
GLuint glew_return = glewInit();

1 Ответ

0 голосов
/ 30 июня 2018

Неверный код настройки. Вы должны выбрать основной контекст профиля перед созданием контекста, изменение профиля после того, как контекст существует слишком поздно, и он не будет работать. Кроме того, согласно документации SDL2, все вызовы SDL_GL_SetAttribute должны быть сделаны до того, как окно будет создано с помощью SDL_CreateWindow.

Переместите все вызовы на SDL_GL_SetAtrribute, чтобы они были до SDL_CreateWindow.

Причина, по которой этот неправильный код работает на других машинах, заключается в том, что разные драйверы предоставляют разные версии OpenGL в зависимости от того, запрашиваете ли вы совместимость или контекст профиля кода.

  • Mesa предоставит только 3,0 для контекстов совместимости,

  • macOS предоставит только 2,1 для контекстов совместимости,

  • Драйверы NVidia и AMD для Windows предоставят последнюю поддерживаемую версию.

...