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