Linux如何正确的glReadPixels将数据写入QImage

How to glReadPixels properly to write the data into QImage in Linux

总结

我想将 glReadPixels 的 opengl 像素 (GL_RGB) 写入 QImage.This 渲染正确,但是当我调整 window 的大小时,它会奇怪地缩放并扭曲我的形状 (三角形)。

我试过的

我试过了(QImage)img.scale(width(),height(),Qt::KeepAspectRatio) 但是并没有解决问题。

试过如何将像素缓冲区从 glReadPixels 写入 QImage,但 No.Didn 不起作用。

我应该读取三个缓冲区中的像素(GLubyte *rpixel、*gpixel、*bpixel)还是一个(GLubyte **pixels)?哪个最简单,因为我会在调整数组大小时调整数组大小window(所以我想要动态数组)。

一些代码

我已经上传了一个最小的代码来重新创建 github.Download 中的 bug-weird 行为并使用 Qt Creator 进行编译。 https://github.com/rivenblades/GlReadPixelsQT/tree/master

图片

这是我想要的(不调整大小时有效)

这是调整大小后的样子(奇怪的行为)

如您所见,在调整大小时,图像在右侧被分割,在左侧可能在另一个处连续 row.So 我猜图像的尺寸是错误的(需要更大的宽度?)。

默认情况下,假定图像每行的开头与 4 个字节对齐。这是因为GL_PACK_ALIGNMENTGL_UNPACK_ALIGNMENT参数默认都是4,见glPixelStore.
glReadPixels 读取帧缓冲区时,会考虑 GL_PACK_ALIGNMENT 参数。

如果你想在一个紧凑的内存中读取图像,而不是在每行的开头对齐,那么你必须在读取颜色平面之前将 GL_PACK_ALIGNMENT 参数更改为 1帧缓冲区:

glPixelStorei(GL_PACK_ALIGNMENT, 1);

glReadPixels(0,0,unchangable_w, unchangable_h, GL_RED, GL_UNSIGNED_BYTE, tga.rpic);
glReadPixels(0,0,unchangable_w, unchangable_h, GL_GREEN, GL_UNSIGNED_BYTE, tga.gpic);
glReadPixels(0,0,unchangable_w, unchangable_h, GL_BLUE, GL_UNSIGNED_BYTE, tga.bpic); 

如果遗漏了这一点,则会在图像的每一行产生偏移效果,除非图像的一行长度(以字节为单位)可以被 4 整除。