如何使用扩展像glGenBuffersARB在Qt5
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方法。我如何得到我现有的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");
}
}
- Qt5:使用QCommandLineParser类时出现奇怪的编译错误
- phytec phyBOARD iMX-6在从闪存而不是SD卡运行qt5 opengles应用程序时表现不佳(FPS减半
- 更改命令行 qt5 源代码构建配置的正确/快速方法
- 控制台输出在 Qt5 中未正确显示
- 在Qt5中使用QTextSteam时的"使用已删除功能"
- Qt5 从 MySQL 数据库中选择数据
- Qt5 远程对象 + 自定义类型,但不在 POD 中
- Qt5 用户界面编译器:-i 选项不可用
- Qt5 throws std::bad_alloc
- 如何避免在 cmake 中自动链接 Qt5 库?
- 动态更改 qt5 选项卡名称
- 可能的Qt5错误:调用setFixedSize()禁用主窗口的关闭按钮(在Win7下)
- QT5 信号不会激活插槽内的功能
- 如何在使用 Qt5 构造函数时将非常量参数修改为常量参数?
- 如何在 Qt5 中执行多个 QProcess
- Qt5 [make -snap] 无法正确编译:进程"/usr/bin/snap"代码 1 退出
- 使用 Qt5 SQL 进行异步数据库访问的策略
- Qt5 ui,多个窗口:如何从窗口 1 访问窗口 2 中的 UI 对象
- 如何使用新语法QT5将信号连接到信号?
- 如何使用扩展像glGenBuffersARB在Qt5