Я отчаянно пытаюсь понять архитектуру OpenGL поддержка в Qt5.
Моя текущая проблема заключается в следующем: у меня есть некоторый существующий код OpenGL (рабочий стол, не OpenGL ES), который использует некоторые расширения OpenGL, в том числе glGenBuffersARB
, Вне Qt5 получить доступ к функциям для расширений, подобных этому, тривиально, например, с помощью GLEW Я мог бы просто сделать это:
glewInit();
И все было бы просто волшебным образом, как и ожидалось, и я мог бы начать использовать glGenBuffersARB
сразу. Если бы я когда-либо волновался, я мог бы позвонить glewIsSupported
чтобы быть уверенным, что это было поддержано.
Но в Qt5 есть предупреждение, что GLEW и QOpenGLFunctions
не очень хорошо играть вместе (скопировано из qopenglfunctions.h
):
#ifdef __GLEW_H__
#if defined(Q_CC_GNU)
#warning qopenglfunctions.h is not compatible with GLEW, GLEW defines will be undefined
#warning To use GLEW with Qt, do not include <qopengl.h> or <QOpenGLFunctions> after glew.h
#endif
#endif
Итак, давайте скажем, что я ради этого вопроса и чтобы полностью удовлетворить любопытную канаву GLEW и полностью полагаться на Qt5 для чистого подхода Qt5. Как мне заставить мой существующий код OpenGL, который полагается на glGenBuffersARB, работать без привязки вручную каждой функции расширения вручную?
ПРИМЕЧАНИЕ: я знаю, что могу следовать советам в этот ответь и сделай так:
auto functions = context->versionFunctions<QOpenGLFunctions_3_3_Core>();
if (!functions) error();
functions->initializeOpenGLFunctions();
functions->glGenBuffersARB(...);
Но тогда мне придется префикс каждой строки существующего кода OpenGL с functions->
что я бы предпочел не делать.
Но тогда мне придется префикс каждой строки существующего кода OpenGL с
functions->
что я бы предпочел не делать.
Вы могли бы, конечно, использовать QOpenGLContext::getProcAddress
загрузить указатели на функции самостоятельно. Но единственный интерфейс, который предоставляет Qt для обработки загрузки функций, это QOpenGLFunctions_*
один. Мало того, они на самом деле не охватывают расширения.
Вы можете использовать классы-оболочки Qt OpenGL, такие как QOpenGLBuffer
и так далее. Но это вещи с наименьшим общим знаменателем. Они не оборачивают все, что вы могли сделать с буферами, используя современный OpenGL. И опять же, они не покрывают расширения; Единственное, что является основной функциональностью.
И есть много OpenGL, не обернутых такими объектами, так что это не совсем комплексное решение.
Лучше придерживаться правильного Загрузка библиотеки OpenGL.
Других решений пока нет …