在Qt中使用glDrawBuffer和glReadBuffer函数

时间:2016-11-19 13:45:42

标签: c++ qt opengl

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

glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);

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

  

main.obj:-1:错误:LNK2019:未解析的外部符号__imp__glDrawBuffer @ 4在函数&#34中引用; public:void __thiscall Simple3DWidget :: OpenGLWindow :: render(void)" (?渲染@ OpenGLWindow @ @@ Simple3DWidget 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);

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

  

访问冲突读取位置0x00000090

奇怪的是,当我将错误的值分配给指针时,我通常会收到此错误,但这些代码都不包含指针(或者函数可能包含生成此错误的指针,在这种情况下可能存在错误在Qt的QOpenGLFunctions_3_1班?)。

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

1 个答案:

答案 0 :(得分:1)

  

此错误基本上意味着函数在包含的头文件中声明但未正确链接。

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

  

但这些代码都不包含指针(或者函数可能包含产生此错误的指针,在这种情况下,Qt的QOpenGLFunctions_3_1类可能存在错误?)。

是的,他们这样做。任何超出某个版本的OpenGL接口都会在运行时加载到函数指针中。这就是QOpenGLFunctions类的功能。在正确加载这些指针之前,它们是无效的 - 实际上,根据OpenGL版本,您使用某些指针可能有效,而其他指令则无效;这就是Qt将OpenGL版本放入类名的原因。

回答以下问题:

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

如果你用" no"回答了这些问题中的任何一个问题。或者"我不知道",那就是你的问题所在。