WedX - журнал о программировании и компьютерных науках

OpenGL 4.1(?) под Mavericks

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

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


  • Вы запрашиваете основной контекст? 08.11.2013
  • 1.2?! Вы уверены, что не имеете в виду 2.1? 08.11.2013
  • Я сталкиваюсь с той же проблемой при запуске примера кода OpenGL SuperBible Fifth Edition, написанного Ричардом Райтом, он использует перенасыщение для создания контекста, после поиска в Интернете люди говорят, что перенасыщение не находится в активной разработке, проблема вызвана GLUT? 06.04.2014
  • @wenboqiu: есть FreeGLUT, который поддерживается ... проблема с его использованием в OS X заключается в том, что он проходит через X11. X11 предоставляется в OS X через совместимый X-сервер под названием XQuartz, вы не можете получить контекст OpenGL 3.2+ с помощью сервера XQuartz, потому что он не реализует необходимое расширение GLX для запроса основного профиля. Таким образом, это означает, что любой фреймворк, использующий 3.2 в OS X, должен использовать собственные API, такие как CGL (полноэкранный и C) или NSOpenGL (полноэкранный/оконный и Objective C). GLFW3 и многие другие фреймворки делают это, а FreeGLUT — нет. 02.06.2014
  • @AndonM.Coleman: спасибо за ответ. 26.09.2014

Ответы:


1

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

СГЛ:

  kCGLPFAOpenGLProfile,     kCGLOGLPVersion_3
  NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core
Core

NSOpenGL:

  NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core

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

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

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

08.11.2013
  • Список атрибутов? контекст основного профиля? Что-то связанное с XCode, без сомнения. К сожалению, я избегаю XCode, так как мое приложение кроссплатформенное. По той же причине я использую GLUT для фреймворка, но я подозреваю, что если я захочу использовать что-то более новое, чем OpenGL 2.1, мне придется стиснуть зубы и больше заниматься MacOS- конкретное развитие. Вздох. В любом случае, спасибо. 09.11.2013
  • @user2507282: Когда я думаю о Xcode, я думаю о чудовищном графическом интерфейсе, который Apple хочет, чтобы вы использовали для написания программного обеспечения для OS X/iOS. создание и управление контекстами рендеринга. В любом случае, не используйте GLUT, если вам нужен современный OpenGL, но при этом скрывающий низкоуровневые особенности ОС; Я бы посоветовал вам использовать что-то вроде glfw3, у вас должен быть контекст основного профиля, чтобы использовать GL 3.2+ в OS X, и древний фреймворк, такой как GLUT, просто не подойдет. 09.11.2013
  • glGetString(GL_VERSION) возвращает мне 4.1 ATI-1.38.3, но по-прежнему отказывается компилировать шейдеры #version 130. Кажется, он принимает шейдеры #version 330, хотя я еще не знаю, как обновить код шейдера до 330... Я предполагаю, что у меня совершенно отдельная проблема? 31.12.2015
  • отказ от ответственности: я использую JOGL, но это результат его оболочки glGetString. 31.12.2015
  • OS X не реализует GLSL 1.30. Они реализуют 1.20 в устаревшем драйвере и 3.20 в ядре. Однако вы можете получить различные расширения, которые касаются 1.40 и 1.50 в устаревшем драйвере. 31.12.2015

  • 2

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

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

    после инициализации glfwInit() включите эти 4 строки кода. эти четыре строки кода позволят вам использовать самую высокую версию, поддерживаемую вашей ОС. на маке это 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);
    

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

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

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

    28.02.2014

    3

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

    Есть несколько основных моментов:

    1. Используйте ОСНОВНОЙ ПРОФИЛЬ
    2. Установите MAJOR.MINOR на версию GL, которую вы хотите использовать.
    3. Если используется не самая новая версия 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);
    
    05.03.2014
  • У меня это тоже сработало, но только после того, как я удалил glew. glew и glfw должны быть совместимы, но в OS X glew не вызывал ничего, кроме проблем. ОП не упомянул блеск, но это было похоже на 2 дня, когда я пытался понять это. Мне также пришлось импортировать <OpenGL/OpenGL.h> и <OpenGL/gl3.h>, и тогда это сработало. 14.04.2016

  • 4

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

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

    07.12.2013

    5

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

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

    06.03.2015

    6

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

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

    обновление варки обновление варки 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);

    07.01.2014
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]