【发布时间】:2014-12-16 10:10:30
【问题描述】:
我在 Qt 4.7.2 中使用 QGLWidget 通过 OpenGL 绘制自己的图片。我使用 OpenGL 是因为我想快速拉伸图像并减少 CPU 使用率。
为此,我有三种方法。一个用于初始化 OpenGL 环境,一个用于从不同的线程更新我的图像数据,另一个用于绘制图像本身。
问题是在我的 updateImage 方法中调用 glTexSubImage2D() 返回一个 GL_INVALID_OPERATION 错误。它试图用 gDEBugger 调试它,但只得到这个错误。如果我查看程序的上下文 1,在调用 glTexSubImage2D(); 后,我只看到大小为 0x0 的纹理;
初始化 OpenGL
void Class::OpenGLInit(void){
QGLContext* context = const_cast<QGLContext *>(QGLContext::currentContext());
if (!context)
{
qDebug() << "Can not get current OpenGL context";
return;
}
context->makeCurrent();
glGenTextures(1,&texture);
glBindTexture(GL_TEXTURE_2D, texture);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_BASE_LEVEL,0);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAX_LEVEL,0);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1024, 1024, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, NULL);
glBindTexture(GL_TEXTURE_2D,0);
}
更新图片
void Class::updateImage(void){
dataPointer = (u_int8_t*) malloc(1024*1024*4);
memcpy(dataPointer,externalBuffer,1024*1024*4);
glBindTexture(GL_TEXTURE_2D, texture);
glTexSubImage2D(GL_TEXTURE_2D,0, 0,0,1024,1024,GL_RGBA,GL_UNSIGNED_INT_8_8_8_8,dataPointer);
//This line returns a GL_INVALID_OPERATION
}
绘制图像
void Class::paintEvent(QPaintEvent *event){
QPainter painter(this);
painter.beginNativePainting();
glClearColor(0.0f,0.0f,0.0f,0.0f);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
//Draw black screen
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glBegin(GL_QUADS);
//Draw Picture
glTexCoord2f(0, 0);
glVertex2f(0, 0);
glTexCoord2f(1024, 0);
glVertex2f(1024, 0);
glTexCoord2f(1024, 1024);
glVertex2f(1024,1024);
glTexCoord2f(0, 1024);
glVertex2f(0, 1024);
glEnd();
glDisable(GL_TEXTURE_2D);
painter.endNativePainting();
}
【问题讨论】:
-
updateImage() 是一个 Qt 插槽。它由 QT::queuedConnection 从另一个线程调用。所以这个函数应该和其他函数在同一个线程中运行
-
你解决了吗?