Подтвердить что ты не робот

OpenGL 4.1 (?) Под Mavericks

Я только что обновил свой MacBook Pro до Mavericks (MacOS 10.9), включая Xcode. Согласно Apple "Таблица возможностей OpenGL", эта версия поддерживает для OpenGL 4.1, но вызов glGetString (GL_VERSION) возвращает "1.2" и мой GLSL 3.30 шейдер, начинающийся с "#version 330", отказывается загружаться, говоря, что версия не поддерживается.

Нужно ли что-то сделать для Mavericks, чтобы включить поддержку 4.1?

4b9b3361

Ответ 1

Когда вы запрашиваете свой формат пикселей с использованием одного из API нижнего уровня в OS X, вам необходимо добавить в список атрибутов следующее: чтобы использовать основной профиль:

ВКТ:

  kCGLPFAOpenGLProfile,     kCGLOGLPVersion_3_2_Core

NSOpenGL:

  NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core

Теперь, когда конкретная константа называется ... 3_2Core, то, что она на самом деле означает, это запрос контекста, который удаляет все устаревшие функции и поддерживает как минимум OpenGL 3.2 (a core профиль, другими словами). Вы можете получить контекст 4.1 или 3.3, используя эту же константу; честно говоря, включая фактический номер версии в константе, вероятно, был плохим выбором.

Если вы не укажете это при запросе своего формата пикселей, OS X предоставит вам kCGLOGLPVersion_Legacy или NSOpenGLProfileVersionLegacy соответственно. И это ограничит вас функциональностью OpenGL 2.1.

Если вы используете инфраструктуру более высокого уровня, вам нужно будет обратиться к своей ссылке API. Однако имейте в виду, что в OS X у вас должен быть контекст профиля core для доступа к чему-либо более новому, чем OpenGL 2.1.

Ответ 2

Используйте библиотеку OpenGL GLFW, последняя версия 3.0.4... сразу после инициализации glfw init

if (!glfwInit())
{
    printf("glfwInit() fail to initualize. \n");
    glfwTerminate();
    exit(-1);
}

после инициализации glfwInit() включают эти 4 строки кода. эти четыре строки кода позволят вам использовать самую высокую версию, поддерживаемую вашей ОС. на mac его opengl 4.1

glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);

затем создайте свое окно.

_Window = glfwCreateWindow(width, height, title, 0, 0);

чтобы убедиться, что он был создан.

if (!_Window) {
    printf("Display window fail to create. \n");
    glfwTerminate();
    exit(-1);
}

затем сделайте это текущим окном, используя следующее.

glfwMakeContextCurrent(_Window);

после того, как вы сделаете это свое окно cureent, все, что осталось сделать, это создать основной цикл.

while (!glfwWindowShouldClose(_Window))
{
    ........
    glfwSwapBuffers(_Window);
    glfwPollEvents();
}

убедитесь, что вы включили glfwPollEvents(); в цикле это позволяет использовать закрытие botton для выхода из окна. если у вас возникли проблемы с компиляцией библиотеки в xcode, просто сообщите мне об этом, и я пришлю вам копию библиотеки.

Ответ 3

Я долгое время занимался этим и, наконец, смог использовать любую версию glsl, поддерживаемую графической картой.

Существует несколько основных моментов:

  • Используйте CORE PROFILE
  • Установите MAJOR.MINOR в версию GL, которую вы хотите использовать
  • Если не используется новейшая версия GL, вам необходимо включить FORWARD COMPATIBILITY.

например, как указано @kanthonye, ​​если вы используете glfw и используете gl версии 3.2, эти строки необходимы:

glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);

Ответ 4

http://support.apple.com/kb/HT5942

название сайта: "Mac-компьютеры: поддержка OpenCL и OpenGL в OS X Mavericks - Узнайте о версиях OpenGL и OpenCL, которые поддерживаются вашим компьютером в OS X Mavericks. "

Ответ 5

Если вы используете LWJGL (начиная с версии 2.90), в заголовок javadoc для ContextAttribs:

... Это расширение не поддерживается в MacOS X. Однако, чтобы включить контекст GL 3.2 в MacOS X 10.7 или новее, экземпляр этого класса должен быть передан в LWJGL. Единственной допустимой конфигурацией является ContextAttribs (3, 2, CONTEXT_CORE_PROFILE_BIT_ARB), все остальное будет проигнорировано.

Ответ 6

Если вы используете SDL в качестве своего API высокого уровня, вам нужно сделать несколько вещей, чтобы получить поддержку 4.1.

Прежде всего убедитесь, что у вас есть SDL2 2.0.1 (или более поздний вариант). Например, используя brew:

brew обновление brew upgrade sdl2

Во-вторых, вам нужно конкретно сказать SDL, чтобы запросить профиль ядра таким образом

SDL_GL_SetAttribute (SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);

В-третьих, причуда в том, как запрашивается основной профиль на Mac, требует, чтобы вы запросили 3.2, чтобы получить 4.1 (!). Я думаю, что это было исправлено в репозитории SDL2, но еще не выпущено.

SDL_GL_SetAttribute (SDL_GL_CONTEXT_MAJOR_VERSION, 3); SDL_GL_SetAttribute (SDL_GL_CONTEXT_MINOR_VERSION, 2);