如何在 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");
}
}
我拼命想了解 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");
}
}