我正在拼命地尝试理解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");
}
}