我在用派生的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));

“image”是一个QByteArray,在QGraphicsView中可以正常工作。因此,似乎我缺少了一些东西。

最佳答案

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都不是正确的工具(每次调用时,它将整个镜像从客户端传输到主机内存)。
最好的方法可能是像您一样创建纹理,然后使用适当的纹理坐标渲染全屏四边形

关于c++ - Qt5.5中的QOpenGLWidget渲染QImage文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33136373/

10-11 01:09