如何使用扩展像glGenBuffersARB在Qt5

How to use extension like glGenBuffersARB in Qt5?

本文关键字:Qt5 glGenBuffersARB 何使用 扩展      更新时间:2023-10-16

我正在拼命地尝试理解OpenGLQt5中的支持架构。

我目前的问题是:我有一些现有的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->,我宁愿不这样做。

但是,我将不得不以functions->作为现有OpenGL代码的每一行前缀,这是我宁愿不做的。

你当然可以自己使用QOpenGLContext::getProcAddress来加载函数指针。但是Qt提供的唯一处理函数加载的接口是QOpenGLFunctions_*。不仅如此,它们并没有真正涵盖扩展。

你可以使用Qt的OpenGL包装类,如QOpenGLBuffer等。但这些都是最小公分母的东西。它们并没有包住你使用现代OpenGL所能做的一切。同样,它们不包括扩展;只有核心功能。

还有很多OpenGL没有被这样的对象包裹,所以这并不是一个全面的解决方案。

最好使用合适的OpenGL加载库

让GL函数在Qt5中可用而不需要使用helper的方法是使您的GL类派生自QAbstractOpenGLFunctions的子类。例如,您的头文件可能看起来像这样:

#include <QOpenGLFunctions_1_1>
class MyGLClass : protected QOpenGLFunctions_1_1
{
    ...
}

然后在你的initialize方法中你需要初始化OpenGL函数如下:

void MyGLClass::initialize()
{
    if (!initializeOpenGLFunctions()) {
        qFatal("initializeOpenGLFunctions failed");
    }
}