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

时间:2016-09-21 23:04:54

标签: c++ opengl qt5 opengl-extensions qopenglfunctions

我正在拼命地理解 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代码?

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

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

但是,我必须为functions->的每一行现有OpenGL代码添加前缀,我宁愿不这样做。

2 个答案:

答案 0 :(得分:2)

  

但是,我必须为functions->的每一行现有OpenGL代码添加前缀,我宁愿不这样做。

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

您可以使用Qt的OpenGL包装类,如QOpenGLBuffer等。但那些是最常见的分母。它们不会使用现代OpenGL包装您可以使用缓冲区完成的所有操作。而且,它们不包括扩展;只有那些核心功能。

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

最好坚持使用合适的OpenGL Loading Library

答案 1 :(得分:1)

让GL函数可用于Qt5中的类而无需使用帮助程序的方法是使GL类从QAbstractOpenGLFunctions的子类派生。例如,您的头文件可能看起来像这样:

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

然后在您的initialize方法中需要初始化 OpenGL的功能如下:

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