繁体   English   中英

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

[英]How to use extension like glGenBuffersARB in Qt5?

我拼命想了解Qt5OpenGL支持的架构

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM