Glew's glewIsSupported("GL_VERSION_3_1") возвращает 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_VERSION_3_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 Server, есть ли способ заставить X Server использовать 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

1 ответ

Решение

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

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

  • Вы должны создать основной контекст, чтобы получить версию OpenGL, отличную от 2.1. Если вы не запрашиваете основной контекст, вы всегда получите 2.1. (The 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 или выше.

Другие вопросы по тегам