我想在Qt中使用Qt Creator中的glDrawBuffer
和glReadBuffer
函数。我试着这样做:在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中使用glDrawBuffer
和glReadBuffer
函数的正确方法是什么?
谢谢,我用'm_openGL31Functions.initializeOpenGLFunctions()'方法,它工作。为什么不在'QOpenGLFunctions_3_1'的构造函数中调用此方法?如果没有初始化这样的对象似乎是没有用的。 –
@DonaldDuck:因为构造函数可能在有OpenGL上下文之前被调用(考虑具有全局作用域的对象,或者在构件完全设置之前在构造实例时初始化的构件类的成员)。总的来说,构造函数是一个糟糕的地方,无论如何要进行初始化。施工人员只应将机器安装到位,但应该完成“转动点火钥匙”这一事实,当事情实际上放在路上时。 – datenwolf
@DonaldDuck:哦,并且实例可能会在OpenGL上下文之间移动(无论出于何种原因),如果发生这种情况,您必须完全重新初始化函数指针。 – datenwolf