QtpenGLWidget在Qt5.5中渲染QImage文件

时间:2015-10-14 22:02:01

标签: c++ qt opengl

我在使用派生QImage类呈现QOpenGLWidget时遇到问题。如果我创建自己的原始图形,一切正常,但我无法创建正确的QOpenGLTexture。我只从内存中看到一些随机像素。我尝试了很多,但它不起作用。这是我的测试代码:

initializeGL()

    initializeOpenGLFunctions();

    glClearColor(0.0, 0.0, 0.0, 0.0);

    glLoadIdentity();
    glMatrixMode(GL_PROJECTION);
    glOrtho(0, this->width(), 0, this->height(), 0, 1);
    glMatrixMode(GL_MODELVIEW);

    glShadeModel(GL_FLAT);


paintGL()

    mTexture->bind();
    glDrawPixels(mTexture->width(), mTexture->height(), QOpenGLTexture::RGBA, GL_UNSIGNED_BYTE, mTexture);

loadImage()

    mTexture = new QOpenGLTexture(QImage::fromData(image).convertToFormat(QImage::Format_RGBA8888));

“图片”是QByteArray,可在QGraphicsView中正常使用。所以我似乎错过了一些东西。

1 个答案:

答案 0 :(得分:2)

glDrawPixels最后一个参数需要一个指向图像数据的指针,你传递一个指向QOpenGLTexture的指针,它是一个完全不相关的对象(它可能甚至不包含图像数据)。

你想要的是这样的:

QImage m_img;

void initializeGL() 
{
  m_img = QImage::fromData(image).convertToFormat(QImage::Format_RGBA8888);
}

void paintGL()
{
  glPixelStorei(GL_UNPACK_ROW_LENGTH, m_img.bytesPerLine() / 4);
  glDrawPixels(m_img.width(), m_img.height(), QOpenGLTexture::RGBA, GL_UNSIGNED_BYTE, m_img.bits());
}

请注意,glDrawPixels无论如何都不是正确的工具(每次调用时它都会将整个映像从客户端传输到主机内存)。 最好的方法可能是像你一样创建纹理,然后使用适当的纹理坐标渲染全屏四边形