【发布时间】:2014-12-08 14:42:03
【问题描述】:
我在 Qt 中有一个继承自 QGLViewer 的窗口。如果我在该类中创建任何着色器程序,QGLShaderProgram myShader 一切运行正常。
但是,我开始将一些渲染调用移动到具有 draw()call 的类之外的类,并且事情被破坏了。
应用程序编译正常,没有错误,但执行时收到错误The program has unexpectedly finished。
我发现从 Qt4 到 Qt5,着色器类发生了变化,在 Qt5 中使用的是 QOpenGLShaderProgram。我试了一下,同样的问题出现了,但是我收到了不同的错误消息QOpenGLFunctions created with a non-current context。
这让我觉得当从一个与实际执行绘图的类没有直接关系的类调用 OpenGL 函数时,OpenGL 上下文“丢失”了。
如何使上下文在所有类中可见?一般来说,我的代码看起来像
MyViewer.hpp
class MyViewer : public QGLViewer
{
MyViewer(const QGLFormat format);
~MyViewer();
protected:
init();
draw()
{
// Clear color buffer and depth buffer
// Do stuff
m_cube.render();
}
private:
...
...
Cube m_cube;
};
Cube.cpp
class Cube
{
public:
Cube()
{
m_shaderProgram.addShaderFromSourceFile(QGLShader::Vertex, ":/vertex.glsl");
m_shaderProgram.addShaderFromSourceFile(QGLShader::Fragment, ":/fragment.glsl");
m_shaderProgram.link();
//Initialize VAO and VBOs
}
void render(){ // render OpenGL calls }
private:
QGLShaderProgram m_shaderProgram;
};
【问题讨论】:
-
OpenGL 上下文绑定到特定线程,但在其他方面是全局的。您很可能在创建上下文之前尝试调用 OpenGL 函数(例如,通过创建着色器)。