Qt glTexSubImage2d没有显示纹理

时间:2015-06-18 22:42:39

标签: qt opengl textures

我正在尝试在QMainWindow中的QOpenGlWidget中显示纹理。 为此我创建了一个派生自QopenGlWidget的类,我的相应小部件被提升为使用该类。

class GLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
    Q_OBJECT
...
}

My plan is to first initlialize the texture once in the initializeGL() method, then use the texture id in the paintGL() method and only update it with glTexSubImage2D().

GLWidget::initializeGL()
{
...
  glTexImage2D(...);
...
}
GLWidget::paintGL()
{
...
   glTexSubImage2D(...);
...
}

仅当我在paintGL()方法中的glTexSubImage2D()之前使用glTexImage()时,这才有效。否则,不会绘制纹理。 我认为绘图上下文存在问题。但我无法理解。

我使用方法void setTexture(...)从外部设置新纹理; 此方法还调用update()来重新绘制窗口小部件。 是否有可能从外部线程调用此方法导致纹理在另一个上下文中呈现?

我尝试在paintGl()方法中设置共享上下文。我使用了initializeGL()方法中使用的上下文。另外,我尝试在painGL()中绘制时从initializeGL()创建当前上下文的上下文。同样的结果。以下是我用于创建纹理的OpenGL函数:

//Works when used in paintGl().
glTexImage2D(GL_TEXTURE_2D,0, GL_RGB, m_cvImage.cols, m_cvImage.rows,0, GL_BGR, GL_UNSIGNED_BYTE, m_cvImage.data);

//Not working when used in paintGl() if glTexImage2D is used to create the texture in initializeGl().
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_cvImage.cols, m_cvImage.rows, GL_BGR,, GL_UNSIGNED_BYTE, m_cvImage.data);

//Also working in paintGL()
glTexImage2D(GL_TEXTURE_2D,0, GL_RGB, m_cvImage.cols, m_cvImage.rows,0, GL_BGR, GL_UNSIGNED_BYTE, NULL);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_cvImage.cols, m_cvImage.rows, GL_BGR, GL_UNSIGNED_BYTE, m_cvImage.data);

当我尝试在paintGL()方法中调用makeCurrent()时(即使它应该在之前自动调用),我得到一个断言:

ASSERT: "context" in file opengl\qopenglfunctions.cpp, line 209

这同样适用于doneCurrent()方法(仅用于测试)。 这告诉我paintGL()方法没有可用的上下文。 然而,对此进行检查似乎没问题。

if (context() == 0)...

0 个答案:

没有答案