我在使用派生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
中正常使用。所以我似乎错过了一些东西。
答案 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
无论如何都不是正确的工具(每次调用时它都会将整个映像从客户端传输到主机内存)。
最好的方法可能是像你一样创建纹理,然后使用适当的纹理坐标渲染全屏四边形