我正在尝试在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)...