2016-11-19 183 views
0

我想在Qt中使用Qt Creator中的glDrawBufferglReadBuffer函数。我试着这样做:在Qt中使用glDrawBuffer和glReadBuffer函数

glDrawBuffer(GL_NONE); 
glReadBuffer(GL_NONE); 

此代码将无法编译,它给了我链接错误像这样的:

main.obj:-1: error: LNK2019: unresolved external symbol [email protected] referenced in function "public: void __thiscall Simple3DWidget::OpenGLWindow::render(void)" ([email protected]@[email protected]@QAEXXZ)

这个错误基本上意味着职能中包含的头文件中声明,但没有正确的联系。

在网络上搜索此问题后,我发现我必须使用QOpenGLFunctions_3_1类。我想这两个代码:

QOpenGLFunctions_3_1 m_openGL31Functions; 
m_openGL31Functions.glDrawBuffer(GL_NONE); 
m_openGL31Functions.glReadBuffer(GL_NONE); 

和:

QOpenGLFunctions_3_1().glDrawBuffer(GL_NONE); 
QOpenGLFunctions_3_1().glReadBuffer(GL_NONE); 

这两个代码编译正确,但是当我运行该程序,在这两种情况下,程序崩溃,给了我以下错误:

Access violation reading location 0x00000090

奇怪的是,当我给你错误的值的指针,我通常得到这个错误,但这些代码包含指针(或可能的功能包含其中产生THI指针在这种情况下,Qt的QOpenGLFunctions_3_1类可能存在错误?)。

在Qt中使用glDrawBufferglReadBuffer函数的正确方法是什么?

回答

1

This error basically means that the functions were declared in an included header file but not correctly linked.

正确。你必须链接到OpenGL。 Windows上的opengl32.lib,MacOS上的* nix/Linux上的libGL.so-framework OpenGL

but none of these codes contain pointers (or maybe the functions contain pointers which generate this error, in which case there could be a bug in Qt's QOpenGLFunctions_3_1 class?).

是的,他们这样做。任何超出特定版本的OpenGL接口都会在运行时加载到函数指针中。这是QOpenGLFunctions类所做的。在正确加载这些指针之前,它们是无效的 - 事实上,取决于OpenGL版本,您正在使用一些可能是有效的,而另一些则不是;这就是为什么Qt将OpenGL版本放入类名的原因。

回答下列问题:

  • 方案是否创建一个OpenGL上下文使用?
  • QOpenGLFunctions_ ...实例是否在调用线程上激活了上下文的情况下进行了初始化?
  • QOpenGLFunctions_ ...实例的初始化是否成功?

如果您以“否”或“我不知道”回答以上任何问题,那就是您的问题所在。

+0

谢谢,我用'm_openGL31Functions.initializeOpenGLFunctions()'方法,它工作。为什么不在'QOpenGLFunctions_3_1'的构造函数中调用此方法?如果没有初始化这样的对象似乎是没有用的。 –

+0

@DonaldDuck:因为构造函数可能在有OpenGL上下文之前被调用(考虑具有全局作用域的对象,或者在构件完全设置之前在构造实例时初始化的构件类的成员)。总的来说,构造函数是一个糟糕的地方,无论如何要进行初始化。施工人员只应将机器安装到位,但应该完成“转动点火钥匙”这一事实,当事情实际上放在路上时。 – datenwolf

+0

@DonaldDuck:哦,并且实例可能会在OpenGL上下文之间移动(无论出于何种原因),如果发生这种情况,您必须完全重新初始化函数指针。 – datenwolf