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?
Ответы
Ответ 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);