【问题标题】:Qt 4.7 - glTexSubImage2D returns GL_INVALID_OPERATIONQt 4.7 - glTexSubImage2D 返回 GL_INVALID_OPERATION
【发布时间】: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 从另一个线程调用。所以这个函数应该和其他函数在同一个线程中运行
  • 你解决了吗?

标签: c++ qt opengl


【解决方案1】:

我刚刚注意到您提到“从另一个线程更新图像”,对吗?您的错误可能是由于调用“updateImage”的线程中缺少 OGL 上下文。请尝试在与 OGL 上下文相同的线程中调用它并使其成为当前的。

【讨论】:

  • 这是答案还是评论?
  • 我认为情况并非如此。函数 updateImage() 是一个 Qt 插槽,它通过 QT::queuedConnection 调用。调试器在与paintEvent(QPaintEvent *event) 和OpenGLInit(void) 相同的线程中运行此函数。
猜你喜欢
  • 1970-01-01
  • 2014-04-02
  • 2014-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多