[英]How to use extension like glGenBuffersARB in Qt5?
我拼命想了解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 代码正常工作,而无需手动绑定每个扩展函数?
注意:我知道我可以按照此答案中的提示进行操作:
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.