我正在拼命地理解 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代码?
注意:我知道我可以按照this回答中的提示操作并执行此操作:
auto functions = context->versionFunctions<QOpenGLFunctions_3_3_Core>();
if (!functions) error();
functions->initializeOpenGLFunctions();
functions->glGenBuffersARB(...);
但是,我必须为functions->
的每一行现有OpenGL代码添加前缀,我宁愿不这样做。
答案 0 :(得分:2)
但是,我必须为
functions->
的每一行现有OpenGL代码添加前缀,我宁愿不这样做。
您当然可以使用QOpenGLContext::getProcAddress
自行加载函数指针。但是Qt提供的唯一可以处理函数加载的接口是QOpenGLFunctions_*
。不仅如此,它们并不真正涵盖扩展。
您可以使用Qt的OpenGL包装类,如QOpenGLBuffer
等。但那些是最常见的分母。它们不会使用现代OpenGL包装您可以使用缓冲区完成的所有操作。而且,它们不包括扩展;只有那些核心功能。
并且有很多OpenGL没有被这些对象包裹,因此它不是一个全面的解决方案。
最好坚持使用合适的OpenGL Loading Library。
答案 1 :(得分:1)
让GL函数可用于Qt5中的类而无需使用帮助程序的方法是使GL类从QAbstractOpenGLFunctions的子类派生。例如,您的头文件可能看起来像这样:
#include <QOpenGLFunctions_1_1>
class MyGLClass : protected QOpenGLFunctions_1_1
{
...
}
然后在您的initialize方法中需要初始化 OpenGL的功能如下:
void MyGLClass::initialize()
{
if (!initializeOpenGLFunctions()) {
qFatal("initializeOpenGLFunctions failed");
}
}