1

我正在拼命地了解Qt5中OpenGL支持的架构。

我目前的问题是:我有一些现有的 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 代码工作?

注意:我知道我可以按照答案中的提示进行操作:

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

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

4

2 回答 2

3

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

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

您可以使用 Qt 的 OpenGL 包装类QOpenGLBuffer等。但这些都是最低公分母的事情。它们并没有包装您可以使用现代 OpenGL 对缓冲区执行的所有操作。再说一次,它们不包括扩展;只有核心功能的东西。

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

最好坚持使用适当的OpenGL 加载库

于 2016-09-22T00:04:00.443 回答
1

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

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

然后在您的初始化方法中,您需要像这样初始化 OpenGL 函数:

void MyGLClass::initialize()
{
    if (!initializeOpenGLFunctions()) {
        qFatal("initializeOpenGLFunctions failed");
    }
}
于 2020-09-14T00:46:17.387 回答