GlewIsSupported (GL_VERSION_3_1) Glew возвращает false на MBP OSX 10.10.1 с NVIDIA GeForce GT 650M

Я пытаюсь запустить программу, которая требует OpenGL 3.1 на моем Macbook Pro Retina с середины 2012 года под управлением OSX 10.10.1 с NVIDIA GeForce GT 650M. Я установил Glew через Homebrew, и запуск glewinfo показывает следующее:

GL_VERSIONglewIsSupported("GL_VERSION_3_1")1:                                              OK 
---------------
glDrawArraysInstanced:                                       OK
glDrawElementsInstanced:                                     OK
glPrimitiveRestartIndex:                                     OK
glTexBuffer:                                                 OK

Однако, когда строка glewIsSupported("GL_VERSION_3_1") в коде, который я выполняю, возвращает false. Я поискал в Интернете и нашел кое-что о X Server на OSX, поддерживающем только OpenGL 2.1, и подумал, что это может быть проблемой.

Поэтому я также загрузил GLView и заметил, что когда я переключаюсь с Core на Compatibility, версия OpenGL падает. с 4.1 до 2.1. Полагаю, это означает, что glewIsSupported("GL_VERSION_3_1") проверяет версию совместимости, а не ядро. Если я изменю этот флажок на GL_VERSION_2_1, будут ли какие-либо риски для моей видеокарты или компьютера в целом? Есть ли способ узнать, требует ли код ядра или совместимости? И если для этого требуется X-сервер, есть ли способ заставить X-сервер использовать OpenGL 3.1?

[РЕДАКТИРОВАТЬ: это заголовки.]

...
#include <GL/glew.h>

#ifdef __linux__
#include <pthread.h>
#include <sys/time.h>
#include <stdio.h>
#include <unistd.h>
#endif

#ifdef __APPLE__
#include <sys/time.h>
#include <stdio.h>
#include <unistd.h>
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif

person Juan Carlos Farah    schedule 30.01.2015    source источник
comment
Неясно, используете ли вы вообще X-сервер в этом примере. XQuartz действительно ограничивает вас OpenGL 2.1, но если вы используете что-то вроде GLFW, который фактически находится поверх собственной оконной системы платформы (он использует NSOpenGL вместо GLX).   -  person Andon M. Coleman    schedule 30.01.2015
comment
Почему вы используете GLEW на Mac? Вам не нужна загрузка расширений в OSX, что является основной причиной использования GLEW на других платформах.   -  person Reto Koradi    schedule 30.01.2015
comment
@ AndonM.Coleman, я не знаю, требует ли код X Server. Я надеялся, что есть способ проверить, требуется ли это.   -  person Juan Carlos Farah    schedule 30.01.2015
comment
@RetoKoradi, когда я запустил cmake, он сказал, что этого требует, и я вижу это в заголовках, которые я добавил к своему вопросу.   -  person Juan Carlos Farah    schedule 30.01.2015


Ответы (1)


Это происходит не только в OS X, потому что GLEW плохо поддерживает основные контексты Open GL. Например, это также происходит в моей системе Linux с Mesa: она сообщает о версии 3.0, хотя на самом деле 3.3 поддерживается.

В OS X я рекомендую следующее:

  • Вы должны создать основной контекст, чтобы получить версию OpenGL, отличную от 2.1. Если вы не запрашиваете базовый контекст, вы всегда получите 2.1. (Программа glewinfo не может запросить основной контекст, поэтому всегда сообщает о версии 2.1 в OS X.)

  • Используйте #include <OpenGL/gl3.h> и просто вызывайте функции напрямую. Функции в этом заголовке будут иметь значение NULL, если они недоступны в вашей системе ... как если бы вы использовали GLEW.

  • Обычно проверяйте номер версии и наличие расширений, используя glGetIntegerv(GL_MINOR_VERSION), glGetIntegerv(GL_MAJOR_VERSION) и glGetStringi(GL_EXTENSIONS).

GLEW совершенно бесполезен для OS X. Библиотека должна делать три вещи:

  1. Он загружает указатели на функции. В OS X это не нужно, потому что OS X позволяет вам получить доступ к этим функциям, просто связавшись с платформой OpenGL, и поскольку эти функции слабо связаны, ваше приложение все равно будет работать, даже если они недоступны. Этот вид слабого связывания недоступен в Linux или Windows.

  2. Он обнаруживает наличие расширений Open GL. Однако GLEW полностью и совершенно не может этого сделать в основных контекстах, потому что он вызывает glGetString(GL_EXTENSIONS) вместо glGetStringi(GL_EXTENSIONS, n). Ой! GLEW неправильно определяет расширения на всех платформах.

  3. Он определяет наличие версий Open GL. Вы можете сделать это самостоятельно с помощью glGetIntegerv(GL_VERSION_MAJOR) и glGetIntegerv(GL_VERSION_MINOR).

Вот почему я не рекомендую GLEW в OS X. По крайней мере, в Windows и Linux он полезен, потому что загружает указатели на функции.

Проверка версии

Полагаю, это означает, что glewIsSupported("GL_VERSION_3_1") проверяет версию совместимости, а не ядро. Если я изменю эту проверку на GL_VERSION_2_1, будут ли какие-либо риски для моей видеокарты или компьютера в целом?

GLEW ничего не знает о ядре или совместимости. Он просто запрашивает версию контекста, которую вы ему даете. Причина, по которой он сообщает о версии 2.1, заключается в том, что это актуальная, истинная версия контекста, который вы используете. Фактическая версия Open GL отличается в OS X в зависимости от того, используете ли вы основной контекст или контекст совместимости.

(Обратите внимание, что на некоторых платформах и драйверах вы также получите разные версии в зависимости от того, какую версию вы запрашиваете, но это не относится к OS X.)

Какая версия Open GL требуется для этого кода?

Есть ли способ узнать, требует ли код ядра или совместимости?

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

  • Посмотрите версии GLSL. Каждая версия GLSL соответствует версии Open GL. 1.20 = OpenGL 2.1, например. Обратите внимание, что основные контексты не требуются для поддержки версий GLSL ниже, чем 1.40.

  • Если в вашем коде используются VAO (объекты массива вершин), предположите, что OpenGL 3.x или выше.

person Dietrich Epp    schedule 30.01.2015
comment
Спасибо за Ваш ответ! Это действительно проливает свет на то, как работают эти инструменты. Сейчас я просматриваю код и пытаюсь понять, смогу ли я заставить его работать с вашими рекомендациями. - person Juan Carlos Farah; 30.01.2015