Как использовать расширение как glGenBuffersARB в Qt5?

Я отчаянно пытаюсь понять архитектуру 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-> что я бы предпочел не делать.

0

Решение

Но тогда мне придется префикс каждой строки существующего кода OpenGL с functions-> что я бы предпочел не делать.

Вы могли бы, конечно, использовать QOpenGLContext::getProcAddress загрузить указатели на функции самостоятельно. Но единственный интерфейс, который предоставляет Qt для обработки загрузки функций, это QOpenGLFunctions_* один. Мало того, они на самом деле не охватывают расширения.

Вы можете использовать классы-оболочки Qt OpenGL, такие как QOpenGLBuffer и так далее. Но это вещи с наименьшим общим знаменателем. Они не оборачивают все, что вы могли сделать с буферами, используя современный OpenGL. И опять же, они не покрывают расширения; Единственное, что является основной функциональностью.

И есть много OpenGL, не обернутых такими объектами, так что это не совсем комплексное решение.

Лучше придерживаться правильного Загрузка библиотеки OpenGL.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]