如何在 Qt5 中使用像 glGenBuffersARB 这样的扩展?

How to use extension like glGenBuffersARB in 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 方法。我如何让依赖 glGenBuffersARB 的现有 OpenGL 代码在不手动绑定每个扩展函数的情况下工作?

注意:我知道我可以按照 this 中的提示回答并执行此操作:

auto functions = context->versionFunctions<QOpenGLFunctions_3_3_Core>();
if (!functions) error();
functions->initializeOpenGLFunctions();
functions->glGenBuffersARB(...);

但是我不得不在现有 OpenGL 代码的每一行前面加上 functions-> 前缀,我不想这样做。

But then I would have to prefix every single line of existing OpenGL code with functions-> which I would rather not do.

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

您可以使用 Qt 的 OpenGL 包装器 类,如 QOpenGLBuffer 等等。但这些是最低公分母的事情。它们不会包装您可以使用现代 OpenGL 对缓冲区执行的所有操作。同样,它们不包括 extensions;只有核心功能的东西。

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

最好坚持适当的 OpenGL Loading Library

让 GL 函数可用于 Qt5 中的 class 而无需使用帮助程序的方法是让您的 GL class 派生自 class 的子class QAbstractOpenGLFunctions。例如,您的头文件可能如下所示:

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

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

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