2016-09-21 77 views
0

我正拼命地理解的架构OpenGL支持Qt5。我目前的问题是这样的:我有一些现有的OpenGL代码(桌面,而不是OpenGL ES),它使用一些OpenGL扩展,包括glGenBuffersARB。外QT5能够访问这些功能,像这样的扩展是微不足道的,例如,通过使用GLEW我可以简单地这样做:如何在Qt5中使用扩展glGenBuffersARB?

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->,我宁愿不做。

+3

供参考:永远不要使用'glGenBuffersARB'。 'glGenBuffers'已经成为核心OpenGL的近十五年了。 –

+0

我刚刚意识到这一点,对不起这是一个非常糟糕的例子,但我认为这个问题仍然很好。试想一下,我正在谈论另一个与今天相关的扩展! (这是我现有的OpenGL代码使用的扩展)。 –

回答

2

但是,然后我将不得不前缀现有的每一行OpenGL代码functions->,我宁愿不做。

你当然可以用QOpenGLContext::getProcAddress自己加载函数指针。但是Qt提供的唯一处理函数加载的接口是QOpenGLFunctions_*之一。不仅如此,它们并不包括扩展。

你可以使用Qt的OpenGL包装类如QOpenGLBuffer等等。但是这些是最普通的分母。他们不会用现代OpenGL来包装你所能做的所有事情。再次,他们不包括分机;只有核心功能的东西。

还有很多OpenGL没有被这些对象所包裹,所以它不完全是一个全面的解决方案。

更好地坚持一个适当的OpenGL Loading Library

+1

从技术角度来说,包装器'QOpenGLBuffer'是最小公分母。虽然不支持* all *可能的缓冲区对象功能,但它实际上会检查扩展,所以它支持范围映射。 (然后,它也有其他基本问题)。 QOpenGLTexture支持不可变的存储,纹理视图和类似的。 – peppe

+0

关于扩展,实际上有QtOpenGLExtensions库('QT + = openglextensions'),你可以像使用'QOpenGLFunctions'一样使用。像'auto f = new QOpenGLExtension_KHR_debug; F-> initializeOpenGLFunctions(); F-> glDebugMessage ...'。我不知道为什么它没有记录,可能是一个错误(因为它是自动生成的)。 – peppe